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
.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.
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.
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).
Vielen Dank für diese Antwort, fand ich heraus, ich habe versucht, mit einer Windows-Flagge irgendwo zu kompilieren! :) –
Gibt es einen Unterschied zwischen .a in Windows und Unix erstellt? – samnaction
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.
- 1. Was ist der Unterschied zwischen .so und .a Dateien?
- 2. Was ist der Unterschied zwischen .o .a und .so Dateien?
- 3. Was ist die Verwendung von .exp und was ist der Unterschied zwischen .lib und .dll
- 4. Was ist der Unterschied zwischen ELF-Dateien und bin-Dateien?
- 5. Was ist der Unterschied zwischen $ a und $$ in PHP?
- 6. Was ist der Unterschied zwischen „$ a“ und ein in Unix $
- 7. Apache logs - was ist der Unterschied zwischen% a und% h?
- 8. Was ist der Unterschied zwischen A. length und A.heap-size?
- 9. Was ist der Unterschied zwischen auto a = A (3) und A a (3)?
- 10. Was ist der Unterschied zwischen .LIB- und .OBJ-Dateien? (Visual Studio C++)
- 11. DLL- und LIB-Dateien - was und warum?
- 12. Was ist der Unterschied zwischen double a = a + int b und int a + = double b?
- 13. Was ist der Unterschied zwischen `==` und `ist`?
- 14. Was ist der Unterschied zwischen .Equals und ==
- 15. Was ist der Unterschied zwischen "a ist b" und "id (a) == id (b)" in Python?
- 16. Was ist der Unterschied zwischen a [0] und & a [0] in der Zeichenkette
- 17. Was ist der Unterschied zwischen der Definition von char a [5] und char (* a) [5]?
- 18. Unterschied zwischen 'a == null' und 'null == a'
- 19. DLL- und LIB-Dateien
- 20. Was ist der Unterschied zwischen:.! und: r !?
- 21. Was ist der Unterschied zwischen Difftime und '-'?
- 22. Was ist der Unterschied zwischen $ und $$?
- 23. Was ist der Unterschied zwischen Verilog! und ~?
- 24. was ist der Unterschied zwischen [[], []] und [[]] * 2
- 25. Was ist der Unterschied zwischen/* ... */und/** ... */
- 26. Was ist der Unterschied zwischen `&` und `ref`?
- 27. Was ist der Unterschied zwischen $ (...) und `...`
- 28. Was ist der Unterschied zwischen "$^N" und "$ +"?
- 29. Was ist der Unterschied zwischen + = und = +?
- 30. Was ist der Unterschied zwischen? und ? = Nil
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
Wie wurden die Inhalte von OpenSSL .a zusammengestellt? Wie verknüpfen Sie Ihre endgültige ausführbare Datei? – crazyscot
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