/ / C++: Was macht #pragma comment(lib, „XXX“) eigentlich mit „XXX“? - C++, Pragma

C ++: Was macht der #pragma-Kommentar (lib, "XXX") eigentlich mit "XXX"? - c ++, Pragma

Mein Hintergrund ist C#, aber ich muss etwas Legacy-C++ (MS) beibehalten. In dieser Codebasis bin ich auf Folgendes gestoßen:

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

wobei 700 eine Versionierung ist. Neben der Bibliothek gibt es eine DLL mit demselben Namen.

Ich dachte zuerst, dass das Programm sein würdehängt von der DLL ab, aber nach dem Entfernen aus dem System funktioniert das Programm immer noch. Es gibt jedoch eine neuere Version der DLL mit dem Namen OtherLib900...

Es scheint, als hätte das Programm den Code der Bibliothek „eingebunden“, sodass er nicht mehr von der externen DLL abhängig ist. (Oder dass das Programm „automatisch“ die neuere DLL verwendet ...)

Was ist richtig? Gibt es eine Möglichkeit, diese „Annahme“ weiter zu bestätigen?

Antworten:

1 für die Antwort № 1

Wenn ein Programm über dieses Pragma verfügt, sucht es nach der Bibliothek OtherLib700.lib. Wenn es sich beim Laden des Programms um eine Importbibliothek handelt, sucht Windows danach OtherLib700.dll in dem Weg. Es wird nicht versucht, danach zu suchen OtherLib900.dll während der Ausführung, also muss es Ihr finden dll in einem anderen Ordner. Dies setzt das voraus OtherLib700.lib ist eine Importbibliothek und keine statische Bibliothek. Wenn OtherLib700.lib eine statische Bibliothek ist, ist das alles, was es braucht.


39 für die Antwort № 2

Das pragma wird verwendet, um eine Verknüpfung mit dem angegebenen herzustellen .lib Datei. Dies ist eine Alternative zur Angabe der Bibliothek im Feld „Externe Abhängigkeiten“ in den Projekteinstellungen.

Meistens wird es zur Unterstützung verschiedener Versionen verwendet:

#ifdef USE_FIRST_VERSION
#pragma comment(lib, "vers1.lib")
#else
#pragma comment(lib, "vers2.lib")
#endif

Wenn Ihre Anwendung eine dynamisch verknüpfte Bibliothek verwendet, a lib Die Datei enthält Informationen darüber, welche Symbole in exportiert werden dll. Im Grunde braucht man also nur das lib zum Kompilieren und Verknüpfen, aber Sie benötigen das dll um das Programm auszuführen, da es den gesamten Binärcode enthält.

Sie sagen, es gibt einen Zusammenhang dll, was normalerweise darauf hinweist lib Die Datei enthält nur Verknüpfungsinformationen und keinen Code. Sie sollten einen Laufzeitfehler erhalten, wenn dies der Fall ist dll wurde nicht gefunden. Sie können bei MSVS nachfragen, ob eine andere Version davon verfügbar ist dll geladen wurde oder ob es von einem anderen Ort geladen wurde.


-2 für die Antwort № 3

Wenn die .lib eine „echte“ Bibliothek mit dem eigentlichen Code ist (ich habe bis auf die vom System bereitgestellten DLLs nie verwendet, aber ich glaube, Sie erstellen „Importbibliotheken“ für Ihre eigenen DLLs), dann ist die DLL keine erforderlich.

Was das Thema betrifft, #pragma comment(lib,xxx)ermöglicht es Programmen, bestimmte Optionen für den Linker hinzuzufügen. Kann sehr nützlich sein, obwohl mir ein paar Optionen entgangen sind, die ich gerne so hinzugefügt hätte. Das angegebene Beispiel ist ein Paradebeispiel für seine Verwendung: Wenn die Objektdatei im Programm enthalten ist, wird die angegebene Bibliothek verwendet ebenfalls hinzugefügt.