2010-12-16 4 views
2

Ich lerne gerade C++ und begann mit verschiedenen Bibliotheken, wie Boost und SDL. Nachdem ich zuerst mit der Konfiguration der Pfade gekämpft habe, scheint jetzt alles in Ordnung zu sein, aber ich habe immer noch einige Fragen darüber, warum verschiedene Bibliotheken anders funktionieren.Unterschiede zwischen C++ - Bibliotheken (Namespaces, Verknüpfung)

  1. Warum ist es, dass viele Bibliotheken (wie Boost) in ihrem Namensraum getrennt sind, gibt es andere (wie SDL), die nicht sind? Für mich ist es sinnvoller, alles getrennt zu halten, da eine Bibliothek nicht wissen kann, welche Funktionen in anderen Bibliotheken verwendet werden. Aber warum ist SDL nicht so?

  2. Warum muss ich die Linker-Einstellungen (.lib-Dateien) für fast jede Bibliothek manuell festlegen, während sie für andere (wie Boost) automatisch ist? Liegt es daran, dass ich das BoostPro-Installationsprogramm verwendet habe, was diese Verknüpfungssuche irgendwie automatisch gemacht hat? Oder gibt es etwas anderes, was ich vermisst habe? Ist es möglich, die Suche nach .lib-Dateien automatisch für andere Bibliotheken zu machen?

Antwort

10
  1. SDL was written in C, und die C-Sprache nicht unterstützt native Namensräume. Boost is a C++-only library und nutzte die C++ - Namespaces voll aus.

  2. Boost ist eine hauptsächlich Header-only-Bibliothek, so dass es nicht die tatsächlichen binaries gibt, um die meiste Zeit zu verknüpfen. Wenn es Binaries zu verbinden gibt (wie Boost.Thread), können die Header Compiler-spezifische Direktiven nutzen, die dem Linker befehlen können, zu bestimmten Bibliotheken zu verlinken (wie VC++ #pragma comment(lib, ...)). Diese Funktion wird im Zusammenhang mit Boost "Auto Link" genannt. Andernfalls müssen Bibliotheken dem Linker explizit genannt werden.

2
  1. Technisch ist SDL eine C-Bibliothek. Da C keine Namespaces hat, verwendet SDL diese nicht. Die Tatsache, dass C++ (größtenteils) rückwärtskompatibel mit C ist, bedeutet, dass Sie SDL in C++ trotzdem verwenden können. Darüber hinaus verwendet SDL das C-Äquivalent von Namespaces: Alle seine Funktionen beginnen mit SDL, wodurch effektiv eine Art Namespace erstellt wird.

  2. AFAIK, die meisten Boost "Bibliotheken" erfordern keine Verknüpfung, da sie nur Header sind. Da könnte ich mich aber irren.

+0

Einige der Boost-Bibliotheken sind nicht Header-only, die Dokumente sagen Ihnen, welche. Die Verknüpfung wird gemäß @In silicos Antwort auf Windows automatisiert. –

Verwandte Themen