Was befindet sich in der LIB-Datei der statischen Bibliothek, der statisch verknüpften dynamischen Bibliothek und der dynamisch verknüpften dynamischen Bibliothek?

81

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?

Sulla
quelle
4
Es konnte festgestellt werden, dass es sich bei der Frage um die MS Windows-Plattform handelt.
cubuspl42

Antworten:

144

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 (und FreeLibrarywenn Sie fertig sind) und GetProcAddressum 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.

Anthony Williams
quelle
4
Nach einer langen Suche, IMO, bekam ich mit einer lib & dll die beste Antwort aus diesem Grund. Danke
Jeet
@Anthony Williams, als Sie sagten: "Für eine dynamische Bibliothek enthält die .lib-Datei eine Liste der exportierten Funktionen und Datenelemente aus der Bibliothek sowie Informationen darüber, aus welcher DLL sie stammen.", Ist diese .lib-Datei mit dem Namen "import" Bibliothek ", die sich von normalen .lib-Dateien unterscheidet (" statische Bibliothek ")?
Stariet
Ja, es ist eine Importbibliothek
Anthony Williams
13

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.

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

Eine für DLLs relevantere LIB-Datei kann jedoch 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 es dem Linker bereitstellen, wenn Sie ein Programm erstellen, das die DLL verwendet, damit es weiß, dass eine externe Kennung tatsächlich eine von der DLL exportierte Funktion ist. Der Linker verwendet die Importbibliothek, um der Importtabelle für die EXE-Datei Einträge hinzuzufügen. Diese wird dann wiederum von Windows zur Laufzeit verwendet, um herauszufinden, welche DLLs geladen werden müssen, um das Programm auszuführen.

Irsis
quelle
8

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:

Verknüpfen ǁ Statisch | DLL | LoadLibrary
========= ǁ =============== | ====================== | = ==================
API-Code ǁ In Ihrem Com | In der DLL | In der DLL
lebt ǁ gestapeltes Programm | |
--------- ǁ --------------- | ---------------------- | - ------------------ ------------------.
Funktion ǁ Direkt, kann | Indirekt über Tabelle | Indirekt über Ihre
Anrufe ǁ elidiert werden | automatisch gefüllt | eigene Funktion ptrs
--------- ǁ --------------- | ---------------------- | - ------------------ ------------------.
Belastung ǁ Compiler | Compiler / OS | Sie / OS
Zahnrad
quelle
Mit statisch verknüpften Bibliotheken meine ich die Verwendung einer LIB-Datei und die Verknüpfung der DLL zur Kompilierungszeit. Die dynamische Verknüpfung verknüpft die DLL zur Laufzeit mit der Funktion libraryloaderex () der Win32-API.
Sulla
6

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.

user34660
quelle
1

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.

Quonux
quelle