Was befindet sich in einer .lib-Datei der statischen Bibliothek, der statisch verknüpften dynamischen Bibliothek und der dynamisch verknüpften dynamischen Bibliothek?
Wie kommt es, dass in einer dynamisch verknüpften dynamischen Bibliothek keine .lib-Datei erforderlich ist und dass in der statischen Verknüpfung die .lib-Datei nichts anderes als eine .obj-Datei mit allen Methoden ist. Ist das korrekt?
c++
dll
linker
static-libraries
Sulla
quelle
quelle
Antworten:
Bei einer statischen Bibliothek enthält die LIB-Datei den gesamten Code und die Daten für die Bibliothek. Der Linker identifiziert dann die benötigten Bits und fügt sie in die endgültige ausführbare Datei ein.
Bei einer dynamischen Bibliothek enthält die LIB-Datei eine Liste der aus der Bibliothek exportierten Funktionen und Datenelemente sowie Informationen darüber, aus welcher DLL sie stammen. Wenn der Linker die endgültige ausführbare Datei erstellt und dann eine der Funktionen oder Datenelemente aus der Bibliothek verwendet wird, fügt der Linker einen Verweis auf die DLL hinzu (wodurch diese automatisch von Windows geladen wird) und fügt Einträge zur Importtabelle der ausführbaren Datei hinzu dass ein Aufruf der Funktion in diese DLL umgeleitet wird.
Sie benötigen keine .lib-Datei, um eine dynamische Bibliothek zu verwenden, aber ohne eine können Sie Funktionen aus der DLL nicht als normale Funktionen in Ihrem Code behandeln. Stattdessen müssen Sie manuell aufrufen
LoadLibrary
, um die DLL zu laden (undFreeLibrary
wenn Sie fertig sind) undGetProcAddress
um die Adresse der Funktion oder des Datenelements in der DLL zu erhalten. Sie müssen dann die zurückgegebene Adresse in einen geeigneten Funktionszeiger umwandeln, um sie verwenden zu können.quelle
Die folgende Antwort von Hans fand ich auch hier nützlich. Es klärt die Luft, dass es zwei Arten von lib-Dateien geben könnte.
quelle
In einer statischen Bibliothek enthält die lib-Datei den tatsächlichen Objektcode für die von der Bibliothek bereitgestellten Funktionen. In der freigegebenen Version (die Sie als statisch verknüpfte dynamische Bibliothek bezeichnet haben) ist gerade genug Code vorhanden, um die dynamische Verknüpfung zur Laufzeit herzustellen.
Ich bin mir nicht sicher über "dynamisch verknüpfte dynamische Bibliotheken" (programmgesteuert geladen). Verknüpfen Sie in diesem Fall sogar eine .lib?Bearbeiten:
Ein bisschen spät, aber nein, Sie verknüpfen keine .lib. Nun, Sie verlinken auf die Bibliothek mit libraryloaderex. Für die tatsächlich verwendete Bibliothek stellen Sie jedoch Ihre eigenen Bindungen über C-Funktionszeiger bereit, und loadlibrary füllt diese aus.
Hier ist eine Zusammenfassung:
quelle
Eine lib-Datei wird vom Linker gelesen und eine DLL-Datei wird während der Ausführung verwendet. Eine lib-Datei ist während der Ausführung im Wesentlichen nutzlos und ein Linker kann eine DLL-Datei nicht lesen (außer möglicherweise auf eine Weise, die hier irrelevant ist).
Die Unterschiede zwischen der Verwendung von lib-Dateien für statische und dynamische Verknüpfungen mögen verwirrend sein, aber wenn Sie ein wenig Geschichte verstehen, wird dies sehr deutlich.
Ursprünglich gab es nur statische Bibliotheken. Bei einer statischen Bibliothek enthält die .lib-Datei obj-Dateien. Jede obj-Datei ist die Ausgabe einer und nur einer Compiler-Quellcode-Eingabedatei. Eine lib-Datei ist nur eine Sammlung verwandter obj-Dateien, ähnlich wie das Einfügen von obj-Dateien in ein Verzeichnis. Das ist im Wesentlichen eine lib-Datei, eine Bibliothek von obj-Dateien. Bei einer statischen Verknüpfung werden alle von einer ausführbaren Datei verwendeten obj-Dateien in einer Datei zusammengefasst. Vergleichen Sie dies mit einem dynamischen Link, in dem sich die ausführbare Datei in einer Datei befindet, die von dem anderen verwendeten Code getrennt ist.
Um eine dynamische Verknüpfung zu implementieren, hat Microsoft die Verwendung von lib-Dateien so geändert, dass sie auf eine DLL-Datei anstatt auf Speicherorte in einer obj-Datei verweisen. Ansonsten sind alle Informationen in einer Bibliothek für eine statische Verknüpfung dieselben wie für eine dynamische Verknüpfung. Sie sind alle gleich, was die Informationen in ihnen betrifft, außer dass eine lib-Datei für einen dynamischen Link die DLL-Datei angibt.
quelle
In DLLs gibt es "Dinge" wie in einer Exe (es kann jede Art von Daten, Importen, Exporten, Lese- / Schreib- / ausführbaren Abschnitten geben), aber der Unterschied besteht darin, dass eine Exe-Datei nur den Einstiegspunkt (Funktion) exportiert, die DLLs jedoch einen exportiert / viele Funktionen.
quelle