DLL- und LIB-Dateien - was und warum?


214

Ich weiß sehr wenig über DLLs und LIBs, außer dass sie wichtigen Code enthalten, der für die ordnungsgemäße Ausführung eines Programms erforderlich ist - Bibliotheken. Aber warum generieren Compiler sie überhaupt? Wäre es nicht einfacher, den gesamten Code in eine einzige ausführbare Datei aufzunehmen? Und was ist der Unterschied zwischen DLLs und LIBs?


Antworten:


296

Es gibt statische Bibliotheken (LIB) und dynamische Bibliotheken (DLL). Beachten Sie jedoch, dass .LIB-Dateien entweder statische Bibliotheken (mit Objektdateien) oder Importbibliotheken (mit Symbolen, damit der Linker eine Verknüpfung zu einer DLL herstellen kann) sein können.

Bibliotheken werden verwendet, weil Sie möglicherweise Code haben, den Sie in vielen Programmen verwenden möchten. Wenn Sie beispielsweise eine Funktion schreiben, die die Anzahl der Zeichen in einer Zeichenfolge zählt, ist diese Funktion in vielen Programmen hilfreich. Sobald diese Funktion ordnungsgemäß funktioniert, müssen Sie den Code nicht mehr bei jeder Verwendung neu kompilieren. Sie legen den ausführbaren Code für diese Funktion in einer Bibliothek ab, und der Linker kann den kompilierten Code extrahieren und in Ihr Programm einfügen . Aus diesem Grund werden statische Bibliotheken manchmal als "Archive" bezeichnet.

Dynamische Bibliotheken gehen noch einen Schritt weiter. Es erscheint verschwenderisch, mehrere Kopien der Bibliotheksfunktionen in jedem der Programme zu belegen. Warum können nicht alle eine Kopie der Funktion gemeinsam nutzen? Dafür sind dynamische Bibliotheken gedacht. Anstatt den Bibliothekscode beim Kompilieren in Ihr Programm zu integrieren, kann er ausgeführt werden, indem er beim Laden in den Speicher Ihrem Programm zugeordnet wird. Mehrere gleichzeitig ausgeführte Programme, die dieselben Funktionen verwenden, können alle eine Kopie gemeinsam nutzen, wodurch Speicherplatz gespart wird. Tatsächlich können Sie dynamische Bibliotheken nur nach Bedarf laden, abhängig vom Pfad durch Ihren Code. Es macht keinen Sinn, wenn die Druckerroutinen Speicher belegen, wenn Sie nicht drucken. Auf der anderen Seite bedeutet dies, dass auf jedem Computer, auf dem Ihr Programm ausgeführt wird, eine Kopie der dynamischen Bibliothek installiert sein muss.

Beispielsweise benötigt fast jedes in 'C' geschriebene Programm Funktionen aus einer Bibliothek namens 'C Runtime Library', obwohl nur wenige Programme alle Funktionen benötigen. Die C-Laufzeit ist sowohl in statischer als auch in dynamischer Version verfügbar, sodass Sie je nach Bedarf bestimmen können, welche Version Ihr Programm verwendet.


80
Es stellt sich heraus, dass .LIBDateien entweder statische Bibliotheken (die Objektdateien enthalten) oder Importbibliotheken (die Symbole enthalten, damit der Linker eine Verknüpfung zu einer DLL herstellen kann) sein können. Ich frage mich, warum das so ist.
Lumi

2
gute Erklärung! Code wird gemeinsam genutzt und Daten werden (standardmäßig) nicht zwischen den Anwendungen geteilt, die eine DLL verbrauchen.
Mox

4
@ Lumi: Guter Punkt. In Bezug auf DLLs gibt es zwei Arten der Verknüpfung. Implizite Verknüpfung , wenn eine .libDatei vom DLL-Ersteller zusammen mit den entsprechenden Headern bereitgestellt wird. Dies .libist lediglich ein Deskriptor der Ziel-DLL. Sie enthält Adressen, Einstiegspunkte usw., jedoch keinen Code. Dies .libmuss an den Linker übergeben werden. Die zweite ist die explizite Verknüpfung, wenn wir die DLL verwenden , indem wir sie manuell mit LoadLibraryFunktion laden . In diesem Typ benötigen wir diese .libDatei nicht, aber wir müssen uns ein wenig Mühe geben, um DLL-Exporte und ihre Adressen zu finden und diese Funktionen über Zeiger aufzurufen.
Itachi

37

Ein weiterer Aspekt ist die Sicherheit (Verschleierung). Sobald ein Teil des Codes aus der Hauptanwendung extrahiert und in eine "getrennte" Dynamic-Link-Bibliothek gestellt wurde, ist es einfacher, den Code anzugreifen, zu analysieren (zurückzuentwickeln), da er isoliert wurde. Wenn derselbe Code in einer LIB-Bibliothek gespeichert wird, ist er Teil der kompilierten (verknüpften) Zielanwendung, und es ist daher schwieriger, diesen Code von den übrigen Zielbinärdateien zu isolieren (zu unterscheiden).


Der Sicherheitsaspekt war für mich neu. Gilt die obige Überlegung für eine C # -App, die eine native, nicht verwaltete C ++ - DLL aufruft?
Martin

1
Aber die LIB ist auch isoliert, nicht wahr? Ein Angreifer könnte also einfach die LIB analysieren. Oder ist es ein häufiges Szenario, dass die LIB der Öffentlichkeit nicht zugänglich ist?
Nick Russler

8
Die LIB ist auch für den Compiler-Prozess "isoliert", aber sobald der Linker die Teile zusammengesetzt hat, ist die LIB Teil der EXE und kann nicht von Ihrem eigenen Code unterschieden werden.
Mox

17

Ein wichtiger Grund für das Erstellen einer DLL / LIB, anstatt nur den Code in eine ausführbare Datei zu kompilieren, ist die Wiederverwendung und Verlagerung. Die durchschnittliche Java- oder .NET-Anwendung (zum Beispiel) verwendet höchstwahrscheinlich mehrere Bibliotheken von Drittanbietern (oder Frameworks). Es ist viel einfacher und schneller, nur mit einer vorgefertigten Bibliothek zu kompilieren, als den gesamten Code von Drittanbietern in Ihre Anwendung zu kompilieren. Das Kompilieren Ihres Codes in Bibliotheken fördert auch gute Entwurfspraktiken, z. B. das Entwerfen Ihrer Klassen für die Verwendung in verschiedenen Arten von Anwendungen.


7

Eine DLL ist eine Bibliothek von Funktionen, die von anderen ausführbaren Programmen gemeinsam genutzt werden. Schauen Sie einfach in Ihr Windows / System32-Verzeichnis und Sie werden Dutzende davon finden. Wenn Ihr Programm eine DLL erstellt, erstellt es normalerweise auch eine lib-Datei, damit das Programm application * .exe Symbole auflösen kann, die in der DLL deklariert sind.

Eine .lib ist eine Bibliothek von Funktionen, die statisch mit einem Programm verknüpft sind - sie werden NICHT von anderen Programmen gemeinsam genutzt. Jedes Programm, das mit einer * .lib-Datei verknüpft ist, enthält den gesamten Code in dieser Datei. Wenn Sie zwei Programme A.exe und B.exe haben, die mit C.lib verknüpft sind, enthalten beide A und B den Code in C.lib.

Wie Sie DLLs und Bibliotheken erstellen, hängt vom verwendeten Compiler ab. Jeder Compiler macht es anders.


4

Ein weiterer Unterschied liegt in der Leistung.

Da die DLL zur Laufzeit von der .exe (s) geladen wird, arbeiten die .exe (s) und die DLL mit dem Shared-Memory-Konzept und daher ist die Leistung im Vergleich zur statischen Verknüpfung gering.

Andererseits ist eine .lib Code, der zur Kompilierungszeit statisch mit jedem angeforderten Prozess verknüpft wird. Daher haben die EXE (s) einen einzelnen Speicher, wodurch die Leistung des Prozesses erhöht wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.