2009-07-14 7 views
13

Ich bin neu in C++ und es gibt etwas, das ich einfach nicht vollständig bekomme. Wenn ich in C# eine externe Bibliothek, zum Beispiel log4net, verwenden möchte, füge ich einfach eine Referenz zur log4net-DLL hinzu und ihre Mitglieder sind automatisch für mich (und in IntelliSense) verfügbar. Wie mache ich das in nicht verwaltetem C++?Wie "Referenz hinzufügen" in C++

Antwort

23

Oft enthält die Bibliothek 1) eine Header-Datei (.h) und 2) eine .lib-Datei zusätzlich zur .dll.

Die Headerdatei ist in Ihrem Code # enthalten, um Ihnen den Zugriff auf die Typ- und Funktionsdeklarationen in der Bibliothek zu ermöglichen.

Die .lib ist in Ihre Anwendung eingebunden (Projekteigenschaften -> Linker -> Eingabe, zusätzliche Abhängigkeiten).

Die .lib-Datei enthält normalerweise einfache Stubs, die automatisch die DLL- und Forward-Funktionsaufrufe dorthin laden.

Wenn Sie keine .lib-Datei haben, müssen Sie stattdessen die LoadLibrary-Funktion verwenden, um die DLL dynamisch zu laden.

+0

Ausführlicher als meine Antwort. Ich würde auch hinzufügen, dass, wenn Sie LoadLibrary verwenden, Sie Funktionen nicht einfach über den Namen aufrufen können. Sie müssen spät binden. –

+1

Ich sehe, dass ich wieder unvollständig bin. LoadLibrary gibt ein Handle zurück, das Sie an GetProcAddress übergeben können, wodurch Sie einen echten Zeiger erhalten. Sie können auch FreeLibrary aufrufen, um es zu entladen. (Ich ging voran und löschte meine ursprüngliche Antwort.) –

+0

@Steven: Stimmt, ich dachte, wenn er LoadLibrary benutzen müsste, würde ich ihm einen Startpunkt geben, ohne sich in den (vielen) dreckigen Details zu verlieren. – jalf

0

Das erste, was Sie tun müssen, ist # die Header-Datei zu enthalten, die die Funktionen beschreibt, die in dieser Bibliothek verfügbar sind.

Der eigentliche Code für die Bibliothek werden in einem der 2 Plätze sein:

  1. Eine statische Bibliothek (LIB)
  2. Eine DLL (DLL)

Je nachdem, wie die Bibliothek-Code wird Ihnen gegeben (als lIB-Dateien oder als DLL), werden Sie entweder:

  • #pragma comment (lib, „libraryname.lib“), wenn its a LIB
  • LoadLibrary Wenn es eine DLL-

Manchmal ist ein Paket mit Datei sowohl einen Lib kommt, die Sie verknüpfen müssen, und eine DLL-Datei. In diesem Fall müssen Sie LoadLibrary nicht aufrufen, Sie müssen nur #pragma kommentieren (lib, "libaryfile.lib"), denn in diesem Fall verbindet Sie die .lib mit der .dll.

Ein sehr wichtiges Detail ist es, die DLL dorthin zu bringen, wo sie von Ihrer Anwendung gefunden werden kann. Charles Petzold sagt:

Wenn Windows ein DLL-Modul laden muss, bevor ein Programm ausgeführt wird, das es erfordert, muss die Bibliotheksdatei in dem Verzeichnis gespeichert werden, das das EXE-Programm, das aktuelle Verzeichnis, das Windows-Systemverzeichnis, enthält Windows-Verzeichnis oder ein Verzeichnis, auf das über die PATH-Zeichenfolge in der MS-DOS-Umgebung zugegriffen werden kann. (Die Verzeichnisse werden in dieser Reihenfolge durchsucht.) Programming windows, 5th ed MSDN

ich nicht empfehlen, das Projekt Eigenschaften-Menü zu verknüpfen, weil es nicht so sichtbar ist, welche Bibliotheken Sie eine Verknüpfung zu.

See also

+0

Dies beantwortet die Frage nicht. –

+0

Dies beantwortet die Frage jetzt aber nicht richtig. Wie jalf sagte, verlinken Sie normalerweise mit der Import-Lib (indem Sie das Pragma verwenden oder es auf andere Weise zur Befehlszeile hinzufügen, die lib.exe enthält). LoadLibrary ist die spätbindende Alternative. –

4

C++ nicht über Bibliotheken im Sinne der Sie denken. Es hat Header-Dateien, die Sie #include, und es hat Dinge namens Bibliotheken, die der Linker behandelt, die den kompilierten Code enthalten. Sie müssen die Bibliotheken (.LIB-Dateien) den Linkereinstellungen hinzufügen.

Wenn Sie unter Windows eine DLL verwenden, sollten Sie idealerweise eine .LIB-Datei mit der Bezeichnung "Import Library" für die DLL haben, und Sie fügen diese .LIB-Datei Ihren Linker-Einstellungen hinzu.

9

Das Grundkonzept ist das folgende: Es gibt 2 Arten von Bibliotheken: statische & dynamisch. Der Unterschied zwischen ihnen besteht darin, dass statische Bibliotheken während des Verknüpfungs-Build-Schritts ihren kompilierten Code in Ihre ausführbare Datei (oder DLL) einbetten; Dynamische Bibliotheken binden nur Zeiger auf die Funktionen ein und eine Anweisung, dass eine DLL geladen werden soll, wenn das Programm geladen wird. Dies wird für Sie vom Linker realisiert.

Jetzt können Sie entscheiden, welche der beiden Sie verwenden werden. DLLs haben viele Vor- und Nachteile. Bei der Entwicklung einer großen Anwendung kann es sinnvoll sein, DLLs mit Delay-Laden anstelle von statischen Bibliotheken zu verwenden. Einige Bibliotheken werden einfach als DLLs an Sie geliefert, und Sie haben keine Wahl. Wie auch immer, der einfachste Weg für einen Anfänger wäre, statische Bibliotheken zu verwenden. Das würde Ihnen die Bereitstellung und den Test wesentlich erleichtern, da Sie bei der Verwendung von DLL sicherstellen müssen, dass sie zur Laufzeit gefunden werden (selbst wenn Sie den Debugger verwenden), indem Sie entweder alles in ein Verzeichnis kopieren oder sich mit Pfadvariablen befassen.

Normalerweise liefert Ihnen ein DLL-Provider (wenn Sie mit der Bibliothek umgehen können) eine Header-Datei und eine .lib, die die Aufrufe in die gewünschte DLL enthält. Bei einigen Anbietern (z. B. Boost) müssen Sie nur die Header-Datei einfügen, und die Lib wird automatisch mit Ihrer ausführbaren Datei verknüpft (kann durch eine prorietäre Pragma-Direktive des Compilers erreicht werden). Wenn dies nicht der Fall ist, müssen Sie in die Projekteinstellungen des C++ - Projekts (Projekteigenschaften/Konfigurationseigenschaften/Linker/Eingabe) gehen und den Namen der lib-Datei in die Zeile "Zusätzliche Abhängigkeiten" eingeben, z. iced.lib iceutild.lib. Sie können auch vollständig qualifizierte Pfadnamen eingeben. Beachten Sie, dass Sie die lib-Dateinamen für beide Konfigurationen (Debug, Release) eingeben müssen. Dies ist die Vorgehensweise, die Sie mit statischen Bibliotheken und Dll gleichermaßen durchführen. Der einzige Unterschied, dass DLL eine DLL-Bibliothek benötigt, ist entweder in Ihrem App-Verzeichnis oder in einem der Pfad-Verzeichnisse.

Nach diesem Schritt erhalten Sie möglicherweise weiterhin Compilerfehler, wenn Sie versuchen, inkompatible Bibliotheken zu verknüpfen. Es gibt viele Gründe, warum sie inkompatibel sein können. Aber versuche zuerst, die lib auf diese Weise zu verlinken und zu sehen, ob das funktioniert. Wenn nicht, posten Sie hier erneut Ihre Fehler;)

Include-Datei (en) ist (sind) verwendet, um an Orten enthalten sein, wo Sie etw verwenden möchten. aus der lib. Einfach einbinden und der Compiler wird wissen, dass die Symbole entweder von einer anderen (kompilierten) Kompilierungseinheit (compilierte cpp-Datei => Objektdatei) oder der .lib stammen müssen. Es macht das Nachschlagen und benachrichtigt Sie, wenn die erforderlichen Symbole nicht gefunden werden.

Good Luck,
Ovanes

P. S. Das mag am Anfang schwierig sein, aber wenn man sich daran gewöhnt hat, wird es einfach sein.