2010-02-25 9 views
29

Ich versuche, etwas statisch zu kompilieren, und ich versuche herauszufinden, was all diese Abhängigkeiten sind. Ich weiß, dass DLL-Dateien für dynamisch verknüpfte Abhängigkeiten sind, die von der endgültigen Ausgabe benötigt werden, aber was sind .a und .lib-Dateien und wann benötigen Sie diese?Was ist der Unterschied zwischen .lib und .a Dateien?

Antwort

28

.a ist ein Archiv von Code: kompiliert, aber nicht verknüpft. Sie würden dies während des letzten Linkschritts Ihres Programms statisch damit verbinden.

.lib kann entweder identisch mit .a oder einer magischen sogenannten "Import-Bibliothek" sein: ein dünner Platzhalter, der zur Laufzeit eine .dll-Datei benötigt.

+0

Ich kompiliere das QT-Framework mit einer .a OpenSSL-Bibliothek, aber irgendwie benötigt meine endgültige ausführbare Datei, die von QT erzeugt wird, immer noch eine externe OpenSSL-DLL, um ausgeführt zu werden. Hast du eine Idee, wie dies der Fall sein könnte, da ich eine .a Bibliothek verwende? – Nantucket

+0

Wie wurden die Inhalte von OpenSSL .a zusammengestellt? Wie verknüpfen Sie Ihre endgültige ausführbare Datei? – crazyscot

+0

Ich bin mir nicht sicher über "erfordern eine. DLL zur Laufzeit". Sie benötigen keine .dll, wenn Ihr Projekt .lib statische Bibliotheken verwendet (es sei denn, es gibt .dll-Abhängigkeiten, die Sie nicht korrekt identifiziert haben). – ha9u63ar

4

Normalerweise .a ist für statische Bibliotheken unter Linux während LIB zur gleichen sind, aber unter Windows. Aber natürlich ist es nur eine Konvention.

19

Auf Unix-Systemen haben Sie die .a Dateien. Dies sind einfache Archive von Objektdateien (.o).

Unter Windows gibt es .lib Dateien, die ziemlich dasselbe sind, aber für Windows anstelle von Unix.

Eine zusätzliche Feinheit ist, dass, um einige Code gegen eine DLL (unter Windows) zu verknüpfen, Sie eine .lib Datei verknüpfen müssen, die einfache Wrapper enthält, die die DLL aufrufen. Auf dem Unix-System werden solche Wrapper traditionell nicht benötigt (der Linker ist intelligent genug, um sie im laufenden Betrieb zu erzeugen).

+0

Vielen Dank für diese Antwort, fand ich heraus, ich habe versucht, mit einer Windows-Flagge irgendwo zu kompilieren! :) –

+0

Gibt es einen Unterschied zwischen .a in Windows und Unix erstellt? – samnaction

5

Etwas, das ich hier noch nicht erwähnt, ist die überraschende Tatsache, dass, zumindest einige der Zeit, .a-Dateien und .lib-Dateien sind eigentlich das gleiche Binärformat. Obwohl ich nichts finden konnte, was auf der mingw-Website so viel sagte, bemerkte ich, dass MS-Visual C++ den 64-Bit-Compiler cl.exe zum Verknüpfen in einer mit dem mingw-w64-g ++ - Compiler erzeugten DLL-Datei verwenden konnte

cl /EHsc /Ipath\to\include gmp_test.cpp path\to\lib\libgmp.dll.a 

und die resultierende Exe-Datei lief so schnell korrekt akzeptiert die Befehlszeile wie ich eine Kopie der entsprechenden DLL-Datei im aktuellen Verzeichnis. (Es wurde gemurmelt die Warnung "Befehlszeilen-Warnung D9024: unerkannter Quelldateityp 'Pfad \ zu \ lib \ gmp-6.0.0 \ lib \ libgmp.dll.a', Objektdatei angenommen".)

Weitere Hinweise ist, dass der Linux file Befehl berichtet "aktuelle AR-Archiv" für mehrere Dateien jeder Erweiterung (.lib oder .a) Ich habe versucht.

Verwandte Themen