wake-up-neo.net

Verknüpfen von DLL in Visual Studio

Wie kann ich in Visual Studio 2010 einen .dll hinzufügen? Ich kann die Option dort nicht finden.

25
smallB

Unter Windows verknüpfen Sie nicht direkt mit einer .dll-Datei - Sie müssen stattdessen die beiliegende .lib-Datei verwenden. Dazu gehen Sie zu Project -> Properties -> Configuration Properties -> Linker -> Additional Dependencies und fügen Sie als nächste Zeile den Pfad zu Ihrer .lib hinzu. 

Sie müssen auch must sicherstellen, dass sich die .dll-Datei entweder in dem Verzeichnis befindet, das in der Umgebungsvariable %PATH% enthalten ist, oder dass sich die Kopie in Output Directory befindet (standardmäßig befindet sich Debug\Release im Ordner des Projekts).

Wenn Sie keinen Zugriff auf die .lib-Datei haben, können Sie .dll zur Laufzeit manuell mit WINAPI-Funktionen wie LoadLibrary und GetProcAddress laden.

43
gwiazdorrr

Sie fügen nicht direkt eine DLL hinzu oder verknüpfen sie direkt mit einer DLL, sondern mit der von der DLL erzeugten LIB.

Eine LIB stellt Symbole und andere erforderliche Daten bereit, um entweder eine Bibliothek in Ihren Code aufzunehmen (statische Verknüpfung) oder auf DLL (dynamische Verknüpfung) zu verweisen.

Um eine Verbindung zu einer LIB herzustellen, müssen Sie sie dem Projekt Eigenschaften -> Linker -> Eingabe -> Zusätzliche Abhängigkeiten hinzufügen. Alle LIB-Dateien hier werden zum Verknüpfen verwendet. Sie können auch ein Pragma wie folgt verwenden:

#pragma comment(lib, "dll.lib")

Bei der statischen Verknüpfung ist der Code in Ihrer ausführbaren Datei enthalten und es gibt keine Laufzeitabhängigkeiten. Für die dynamische Verknüpfung muss ein DLL mit übereinstimmendem Namen und Symbolen in dem Suchpfad verfügbar sein (wobei nicht nur der Pfad oder das Systemverzeichnis ist).

21
ssube

Ich finde es nützlich, die zugrunde liegenden Werkzeuge zu verstehen. Dies sind cl.exe (Compiler) und link.exe (Linker). Sie müssen dem Compiler die Signaturen der Funktionen mitteilen, die Sie in der dynamischen Bibliothek aufrufen möchten (indem Sie den Bibliotheksheader hinzufügen), und Sie müssen dem Linker mitteilen, wie die Bibliothek aufgerufen wird und wie sie aufgerufen werden soll (indem Sie die "implib" einfügen). oder Bibliothek importieren).

Dies ist ungefähr derselbe Prozess, den gcc für die Verknüpfung mit dynamischen Bibliotheken unter * nix verwendet, nur die Bibliotheksobjektdatei unterscheidet sich.

Wenn Sie die zugrunde liegenden Tools kennen, können Sie die entsprechenden Einstellungen in IDE schneller finden und überprüfen, ob die generierten Befehlszeilen korrekt sind.

Beispiel

Sagen Sie A.exe hängt von B.dll ab. Sie müssen den Header von B in A.cpp (#include "B.h") einfügen, dann kompilieren und mit B.lib verknüpfen:

cl A.cpp /c /EHsc
link A.obj B.lib

Die erste Zeile erzeugt A.obj, die zweite Zeile A.exe. Das Flag /c weist cl an, nicht zu verknüpfen, und /EHsc gibt an, welche Art von C++ - Ausnahmebehandlung die Binärdatei verwenden soll (es gibt keinen Standardwert, daher müssen Sie etwas angeben).

Wenn Sie /c nicht angeben, ruft cl link für Sie auf. Sie können das Flag /link verwenden, um zusätzliche Argumente für link anzugeben und dies auf einmal zu tun, wenn Sie möchten:

cl A.cpp /EHsc /link B.lib

Wenn sich B.lib nicht im Pfad INCLUDE befindet, können Sie einen relativen oder absoluten Pfad angeben oder das übergeordnete Verzeichnis zu Ihrem Include-Pfad mit dem Flag /I hinzufügen.

Wenn Sie von Cygwin aus anrufen (wie ich), ersetzen Sie die Schrägstriche durch Bindestriche.

Wenn Sie #pragma comment(lib, "B.lib") in A.cpp schreiben, teilen Sie dem Compiler lediglich mit, dass er einen Kommentar in A.obj hinterlässt, in dem der Linker auf B.lib verlinkt wird. Dies ist gleichbedeutend mit der Angabe von B.lib in der Link-Befehlszeile.

2
cmc