wake-up-neo.com

Was ist in der .lib-Datei der statischen Bibliothek, der statisch verknüpften dynamischen Bibliothek und der dynamisch verknüpften dynamischen Bibliothek enthalten?

Was enthält eine .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 benötigt wird und dass bei einer statischen Verknüpfung die .lib-Datei nichts anderes als eine .obj-Datei mit allen Methoden ist. Ist das korrekt?

75
Sulla

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 legt sie in der endgültigen ausführbaren Datei ab.

Bei einer dynamischen Bibliothek enthält die .lib-Datei eine Liste der exportierten Funktionen und Datenelemente aus der Bibliothek sowie Informationen darüber, aus welchen DLL) sie stammen. Wenn der Linker die endgültige ausführbare Datei erstellt, gilt Folgendes: if Wenn eine der Funktionen oder Datenelemente aus der Bibliothek verwendet wird, fügt der Linker einen Verweis auf die DLL (wird von Windows automatisch geladen)) hinzu 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 in Ihrem Code nicht wie normale Funktionen behandeln. Stattdessen müssen Sie LoadLibrary zum Laden der DLL (und FreeLibrary, wenn Sie fertig sind) und GetProcAddress zum Abrufen der Adresse der Funktion oder des Datenelements in der DLL Anschließend müssen Sie die zurückgegebene Adresse in einen geeigneten Zeiger auf eine Funktion umwandeln, um sie zu verwenden.

126

Ich fand folgende Antwort von Hans auch hier nützlich. Es macht deutlich, dass es zwei Arten von lib-Dateien geben könnte.

Eine LIB-Datei wird zum Erstellen Ihres Programms verwendet. Sie existiert nur auf Ihrem Build-Computer und wird nicht ausgeliefert. Es gibt zwei Arten. Eine statische Linkbibliothek ist eine Sammlung von OBJ-Dateien, die in einer einzigen Datei zusammengefasst sind. Der Linker wählt alle Codestücke aus der Datei aus, wenn ein externer Bezeichner aufgelöst werden muss.

Für DLLs relevanter kann eine LIB-Datei auch eine Importbibliothek sein. Es ist dann eine einfache kleine Datei, die den Namen der DLL und eine Liste aller von der DLL exportierten Funktionen enthält. Sie müssen sie dem Linker zur Verfügung stellen, wenn Sie ein Programm erstellen Der Linker verwendet die DLL, um zu wissen, dass ein externer Bezeichner tatsächlich eine von der DLL exportierte Funktion ist. Der Linker verwendet die Importbibliothek, um Einträge zur Importtabelle für die EXE hinzuzufügen turn wird von Windows zur Laufzeit verwendet, um herauszufinden, welche DLLs geladen werden müssen, um das Programm auszuführen.

12
irsis

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 nicht sicher "dynamisch verknüpfte dynamische Bibliotheken" (programmgesteuert geladen). Verknüpfen Sie in diesem Fall sogar mit einer .lib-Datei?

Bearbeiten:

Ein bisschen spät dran, aber nein, Sie verknüpfen keine .lib. Nun, Sie verlinken mit libraryloaderex auf die Bibliothek. Für die tatsächliche Bibliothek, die Sie verwenden, stellen Sie Ihre eigenen Bindungen über C-Funktionszeiger bereit, und loadlibrary füllt diese aus.

Hier ist eine Zusammenfassung:

 Verknüpfen ǁ Statisch | DLL | LoadLibrary 
 ========= ǁ ======================= =============== | ================== 
 API-Code ǁ In Ihrem Computer | In der DLL | In der DLL 
 Lebt ǁ gestapeltes Programm | | 
 --------- ǁ ---------- ----- | ---------------------- | ------------------- 
 Funktion ǁ Direkt, kann | indirekt über Tabelle | indirekt über Ihre 
 Aufrufe ǁ werden automatisch ausgefüllt | eigene Funktion ptrs 
 --------- ǁ --- ------------ | ---------------------- | -------------- ----- 
 Aufwand ǁ Compiler | Compiler/OS | Sie/OS 
7
Cogwheel

Eine lib-Datei wird vom Linker gelesen und während der Ausführung wird eine dll-Datei verwendet. Eine lib-Datei ist während der Ausführung im Wesentlichen nutzlos und ein Linker ist nicht in der Lage, lesend eine dll-Datei (außer möglicherweise in einer 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 einzigen Compiler-Quellcode-Eingabedatei. Eine lib-Datei ist nur eine Sammlung verwandter obj-Dateien, ähnlich wie das Ablegen von obj-Dateien in einem Verzeichnis. Das ist im Grunde genommen 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 vom anderen verwendeten Code getrennt ist.

Um die dynamische Verknüpfung zu implementieren, hat Microsoft die Verwendung von lib-Dateien so geändert, dass sie sich auf eine dll-Datei anstatt auf Speicherorte in einer obj-Datei beziehen. Ansonsten sind alle Informationen in einer Bibliothek für eine statische Verknüpfung dieselben wie für eine dynamische Verknüpfung. Sie sind in Bezug auf die darin enthaltenen Informationen alle gleich, mit der Ausnahme, dass eine lib-Datei für einen dynamischen Link die DLL-Datei angibt.

5
user34660

In dlls gibt es "Dinge" wie in einer exe (es kann jede Art von Daten geben, Importe, Exporte, Lese-/Schreib-/ausführbare Abschnitte), aber der Unterschied ist, dass eine exe-Datei nur den Einstiegspunkt (Funktion) exportiert, aber die dlls eine exportiert/viele funktionen.

1
Quonux