Warum muss ich eine lib-Datei mit meinem Projekt verknüpfen?

8

Ich erstelle ein Projekt, das eine DLL verwendet. Um mein Projekt zu erstellen, muss ich eine Header-Datei und eine Lib-Datei enthalten. Warum muss ich die entsprechende lib-Datei angeben? sollte nicht die Header-Datei alle benötigten Informationen deklarieren und dann zur Laufzeit eine benötigte Bibliothek / DLL laden?

Danke

    
Peretz 05.08.2011, 13:27
quelle

7 Antworten

3

In vielen anderen Sprachen ist das Äquivalent der Header-Datei alles, was Sie brauchen. Aber die üblichen C-Linker unter Windows haben immer Import-Bibliotheken verwendet, C ++ - Linker folgten, und es ist wahrscheinlich zu spät, um sie zu ändern.

Als Gedankenexperiment könnte man sich eine solche Syntax vorstellen:

%Vor%

Mit dieser Information bewaffnet könnte die Compiler / Linker-Werkzeugkette den Rest erledigen.

Als ein weiteres Beispiel würde man in Delphi diese Funktion importieren, indem man implizites Verknüpfen verwendet, wie etwa:

%Vor%

was nur zeigen wird, dass Import-Bibliotheken a priori nicht essentiell für die Verknüpfung mit DLLs sind.

    
David Heffernan 05.08.2011, 13:30
quelle
3

Das ist eine sogenannte "Import-Bibliothek", die nur minimale Verdrahtung enthält, die das Betriebssystem (zur Ladezeit) dazu auffordert, die DLL zu laden.

    
sharptooth 05.08.2011 13:30
quelle
3

Nein, die Header-Datei ist nicht ausreichend. Die Header-Datei kann nur die Deklarationen der Funktionen und Klassen und andere Dinge enthalten, die Sie brauchen, nicht ihre Implementierungen.

Es gibt eine Welt des Unterschieds zwischen diesem Code:

%Vor%

und dieser Code:

%Vor%

Die erste ist eine Deklaration und die zweite ist eine Definition oder Implementierung. In der Regel wird das erste Beispiel in Header-Dateien und das zweite in .CPP-Dateien (wenn Sie Bibliotheken erstellen) eingefügt. Wenn Sie einen Header mit dem ersten eingefügt haben und nicht mit irgendetwas verknüpft haben, wie soll Ihre Anwendung dann Multiply implementieren?

Wenn Sie jetzt Header-Dateien verwenden, die ALLEN Inlined-Code enthalten, müssen Sie nichts verknüpfen. Aber wenn auch nur eine Methode NICHT inline ist, sondern ihre Implementierung in einer .CPP-Datei, die in eine .lib-Datei kompiliert wird, dann müssen Sie in die .lib-Datei verlinken.

[BEARBEITEN] Bei Verwendung von Importbibliotheken weisen Sie den Linker an, die Implementierungsdetails des importierten Codes NICHT in Ihre Binärdatei aufzunehmen. Stattdessen lädt das Betriebssystem die Import-DLL zur Laufzeit in Ihren Prozess. Dadurch wird Ihre Anwendung kleiner, aber Sie müssen eine andere DLL damit versenden. Wenn sich die Implementierung der Bibliothek ändert, können Sie einfach eine weitere DLL an Ihre Kunden senden und müssen nicht die gesamte Anwendung neu versenden.

Es gibt eine weitere Option, bei der Sie einfach eine Bibliothek verknüpfen können und keine weitere DLL versenden müssen. Bei dieser Option fügt der Linker die Implementierung in Ihre Anwendung ein und vergrößert sie. Wenn Sie die Implementierungsdetails in der importierten Bibliothek ändern müssen, müssen Sie die gesamte Anwendung neu kompilieren und neu verknüpfen und die gesamte Sache an Ihre Kunden senden.

    
C Johnson 05.08.2011 13:37
quelle
2

DLLs sind ein Windows (MS / Intel) Ding. Die (generierte) Lib enthält den Code, der benötigt wird, um die DLL aufzurufen, und sie "normal" Funktionen für den Rest Ihrer App verfügbar macht.

    
Henk Holterman 05.08.2011 13:31
quelle
1

Hier gibt es zwei relevante Phasen im Bauprozess:

  • Kompilierung: vom Quellcode in eine Objektdatei. Während der Kompilierung muss der Compiler wissen, welche externen Dinge verfügbar sind, dafür braucht man eine Deklaration. Deklarationen, die für die Verwendung in mehreren Kompilierungseinheiten vorgesehen sind, sind in Kopfzeilen gruppiert. Sie benötigen also die Header für die Bibliothek.

  • Verknüpfung: Für statische Bibliotheken benötigen Sie die kompilierte Version der Bibliothek. Für dynamische Bibliotheken benötigen Sie in Unix die Bibliothek, in Windows benötigen Sie die "Import-Bibliothek".

Sie könnten denken, dass eine Bibliothek auch die Deklarationen einbetten könnte, oder die Überschrift könnte die Bibliothek enthalten, die verlinkt werden muss. Die erste wird oft in anderen Sprachen gemacht. Die zweite ist manchmal über Pragmas in C und C ++ verfügbar, aber es gibt keine standardmäßige Möglichkeit, dies zu tun und würde mit der üblichen Verwendung kollidieren (z. B. die Auswahl einer Bibliothek unter mehreren, die Codevarianten für dieselben Deklarationen bereitstellen, z. Single Thread / Multithreads freigeben). Und keine der beiden Optionen passt gut zu dem einfachen Kompilierungsmodell von C und C ++, das seine Wurzeln in den 60er Jahren hat.

    
AProgrammer 05.08.2011 13:44
quelle
1

Die Header-Datei wird vom Compiler verbraucht. Es enthält alle Vorwärtsdeklarationen von Funktionen, Klassen und globalen Variablen, die verwendet werden. Es kann auch einige Inline-Funktionsdefinitionen enthalten.

Diese werden vom Compiler verwendet, um ihm die minimalen Informationen zu geben, die er zum Kompilieren Ihres Codes benötigt. Es enthält keine Implementierungsdetails.

Sie müssen jedoch immer noch alle Funktions- und Variablendefinitionen verknüpfen, über die Sie dem Compiler informiert haben. Wenn Sie dies nicht tun, führt dies zu einem Linker-Fehler. Oft ist dies in anderen Objektdateien enthalten, die zu einer einzigen statischen Bibliothek zusammengefügt werden können.

Im Falle von DLLs (oder .so-Dateien) müssen wir dem Linker immer noch mitteilen, wo sich die fehlenden Symbole in der DLL oder dem gemeinsamen Objekt befinden. Unter Windows sind diese Informationen in einer LIB-Datei enthalten. Dadurch wird der Code zum Laden und Verknüpfen des Codes zur Laufzeit generiert.

Unter Unix werden die dll- und lib-Dateien in einer einzigen .so-Datei zusammengefasst, die Sie mit Linker-Fehlern verknüpfen müssen.

Sie können weiterhin eine DLL ohne eine .lib-Datei verwenden, aber Sie müssen dann alle Symbole manuell laden und verknüpfen, indem Sie Betriebssystem-APIs verwenden.

    
doron 05.08.2011 13:47
quelle
1

von 1000 ft, die lib enthält die Liste der Funktionen, die dll exportiert und Adressen, die für den Anruf benötigt werden.

    
cprogrammer 05.08.2011 14:07
quelle

Tags und Links