2 Stimmen

Für eine LIB sind keine zusätzlichen Abhängigkeiten erforderlich, für eine DLL jedoch schon

Ich habe ein Framework (in C++), das von einigen Bibliotheken von Drittanbietern abhängig ist. Wenn ich eine statische Version des Frameworks kompiliere Bibliothek Framework sind keine zusätzlichen Abhängigkeiten erforderlich, d. h. die lib Dateien der Bibliotheken des dritten Teils werden nicht benötigt. Wenn ich das gleiche Framework als DLL werden nun zusätzliche Abhängigkeiten benötigt, da ich sonst Verknüpfungsfehler erhalte. Ich kann erraten, warum dies geschieht, aber möchte eine konkrete Antwort/Erklärung, um zu verstehen, was passiert.

EDIT: Nur zur Klarstellung: Ich entwickle ein Framework, das als lib und als dll y dann in einem(n) (ausführbaren) Projekt verwendet. Beim Kompilieren des Frameworks als lib und Funktionen aus einer Bibliothek eines Drittanbieters zu verwenden, benötige ich keine zusätzlichen Abhängigkeiten. Ein Projekt, das nun aber die lib Datei (die das Gerüst darstellt) muss die 3rd party lib Dateien. Wenn ich das Framework als dll es gibt mir Verknüpfung Fehler, wenn ich die 3. Teil Bibliotheken der Rahmen ist technisch abhängig von angeben. Zum Beispiel: Ich habe ein paar Klassen, die Funktionen aus Ogre3D aufrufen. Diese Klassen sind kompiliert als lib Datei. Ich brauche keine Verknüpfung mit OgreMain.lib beim Kompilieren einer lib der Klassen. Andererseits, wenn ich beim Kompilieren einer dll Version der gleichen Klassen muss ich nun gegen OgreMain.lib

4voto

metal Punkte 5857

Wenn Sie eine statische Bibliothek (eine .lib-Datei) haben, die nur eine Sammlung von einer oder mehreren Objektdateien (.obj) ist, fügt der Linker diesen Code einfach zu Ihrem Code in einer ausführbaren Datei hinzu. Sie können den Linker über einen Befehlszeilenschalter, eine IDE-Konfigurationseinstellung oder vielleicht sogar ein #pragma anweisen, dies zu tun (die Einzelheiten hängen von Ihrer Umgebung und Ihrem Compiler ab).

Wenn Sie eine DLL einbinden, müssen Sie dem Linker einen Code übergeben, den er aufrufen soll, wenn Sie eine der DLL-Funktionen aufrufen. Normalerweise geschieht dies mit einer Datei, die den gleichen Namen wie die DLL trägt, nur dass es sich um eine .lib handelt. Der Code in dieser .lib wird auf die gleiche Weise wie oben beschrieben in Ihr Programm gelinkt, aber wenn Sie ihn aufrufen, wird die DLL geladen (falls sie nicht bereits geladen ist) und dann die entsprechende Funktion aufgerufen.

Es gibt andere Möglichkeiten, DLL-Verknüpfungen zu handhaben (z. B. .def-Dateien oder #using-Anweisungen in .NET), aber dies scheint das zu sein, was Sie meinen.


Als Antwort auf Ihre Frage Klärung:

Das Problem ist, dass eine .lib kein Endprodukt ist. Sie ist lediglich eine Ansammlung von Objektcode, der später verwendet werden soll, wenn ein Linker alle Ihre Funktionsaufrufe mit Funktionsadressen verknüpft.

Eine DLL hingegen ist ein Endprodukt, und deshalb verlangt der Linker, dass alle Funktionen und Variablen mit tatsächlichen Adressen verbunden sind.

Ich drücke mich etwas ungenau aus, aber Sie verstehen die Idee.

0voto

Andy Dent Punkte 16955

Eine statische Bibliothek kann andere statische Bibliotheken einschließen und eine einzige Bibliothek zum Verknüpfen bereitstellen

Eine DLL kann statische Bibliotheken enthalten, so dass eine einzige DLL zum Binden entsteht.

Eine DLL oder statische Bibliothek, die von anderen DLLs abhängig ist, kann nicht kombiniert werden, so dass Ihre ausführbare Datei explizit mit diesen anderen DLLs verknüpft werden muss.

0voto

David Feurle Punkte 2657

Wenn Sie einen Link zu einer LIB erstellen, werden alle Symbole/Funktionen, die Sie tatsächlich verwenden, zu Ihrer ausführbaren Datei hinzugefügt. Diejenigen, die Sie nicht verwenden, werden nicht hinzugefügt. Wenn Sie mit einer DLL verknüpfen, wird der gesamte Code der externen Bibliothek geladen. Wenn dieser zusätzliche Code (Code, den Sie nicht verwenden) von weiteren externen Bibliotheken abhängt, müssen Sie diese ebenfalls bereitstellen.

Ein Beispiel: Sie wollen eine ip-Klasse aus einer Netzwerkbibliothek verwenden. Die Klasse ip ist nicht von anderen Bibliotheken abhängig. Andere Funktionen in der Netzwerkbibliothek hängen von anderen externen Bibliotheken ab. Wenn Sie die Netzwerkbibliothek als LIB verknüpfen, verknüpfen Sie nur die IP-Klasse -> Sie brauchen die anderen Bibliotheken nicht, da der andere Code nicht verknüpft wird. Wenn Sie die DLL verwenden, muss der gesamte Code in der DLL instanziiert werden -> Sie müssen also die anderen externen Bibliotheken bereitstellen.

0voto

Jesper Madsen Punkte 66

Die Erstellung einer DLL ist eher mit der Erstellung einer Anwendung als mit der einer Bibliothek vergleichbar. Der Unterschied zwischen der Erstellung einer Anwendung und einer DLL besteht in der Kenntnis dessen, was aufgerufen werden könnte. In einer Anwendung können alle Symbole, die nicht verwendet werden, bei der Erstellung verworfen werden, aber in einer DLL können Sie keine Symbole entfernen, die nicht verwendet werden - das wären dann alle... Sie würden die gleichen Link-Probleme in Ihren statischen Bibliotheken finden, wenn Sie in der Lage wären, alle Symbole aufzurufen, die die DLL verlinkt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X