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 № 1Wenn 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.