2010-02-25 12 views
29

Próbuję statycznie skompilować coś i próbuję uzyskać uchwyt na temat wszystkich tych zależności. Wiem, że pliki .dll są dla dynamicznie powiązanych zależności, które będą wymagane przez ostateczny wynik, ale czym są pliki .a i .lib i kiedy ich potrzebujesz?Jaka jest różnica między plikami .lib i .a?

Odpowiedz

28

.a jest archiwum kodu: skompilowane, ale nie połączone. Statycznie łączyłbyś się z nim podczas końcowego etapu łączenia twojego programu.

.lib może być taki sam jak .a lub magiczna tak zwana "biblioteka importu": cienki symbol zastępczy, który powoduje, że będziesz musiał .dll w czasie wykonywania.

+0

Kompiluję framework QT z biblioteką .a OpenSSL, ale jakoś mój końcowy plik wykonywalny produkowany przez QT nadal wymaga zewnętrznej biblioteki OpenSSL, aby mógł działać. Czy masz pojęcie, jak to się dzieje, biorąc pod uwagę, że używam biblioteki .a? – Nantucket

+0

W jaki sposób zostały skompilowane zawartość OpenSSL .a? W jaki sposób łączysz swój końcowy plik wykonywalny? – crazyscot

+0

Nie jestem pewien o "wymagają. Dll w czasie wykonywania". Nie będziesz potrzebować .dll, jeśli twój projekt używa bibliotek statycznych .lib (chyba że istnieją zależności .dll, które nie zostały poprawnie zidentyfikowane). – ha9u63ar

4

Zazwyczaj .a jest dla bibliotek statycznych pod Linuksem natomiast lib są za takie same, ale w systemie Windows. Ale oczywiście to tylko konwencja.

19

W systemach Unix dostępne są pliki .a. Są to proste archiwa plików obiektów (.o).

W systemie Windows są pliki .lib, które są całkiem tym samym, ale w systemie Windows zamiast w systemie Unix.

Dodatkową subtelnością jest to, że aby połączyć jakiś kod z biblioteką DLL (w systemie Windows), należy połączyć z plikiem .lib, który zawiera proste opakowania, które wywołują bibliotekę DLL. W systemie Unix tradycyjnie nie ma potrzeby takich wrapperów (linker jest wystarczająco inteligentny, by generować je w locie).

+0

Dziękuję za tę odpowiedź, dowiedziałem się, że próbowałem skompilować się gdzieś z flagą Windowsa! :) –

+0

Czy jest jakaś różnica między .a stworzony w systemie Windows i UNIX? – samnaction

5

Coś, o czym tutaj nie wspomniałem, to zaskakujący fakt, że przynajmniej niektóre pliki .lib i .lib są w rzeczywistości takie same, jak w tym samym formacie binarnym. Chociaż nie mogłem znaleźć niczego mówiącego na stronie internetowej mingw, zauważyłem, że gdy próbuję uzyskać 64-bitowy kompilator MS.exe C++ do połączenia w pliku .dll wyprodukowanym przy użyciu kompilatora mingw-w64 g ++, to szczęśliwie przyjął linię poleceń

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

i wynikowy plik .exe biegł tak szybko, jak prawidłowo umieścić kopię odpowiedniego pliku .dll w katalogu bieżącym. (Mrucząc ostrzeżenie "Ostrzeżenie D9024 linii poleceń: nierozpoznany typ pliku źródłowego" ścieżka \ do \ lib \ gmp-6.0.0 \ lib \ libgmp.dll.a ', obiekt obiektu przyjęty ".)

Dalsze dowody jest to, że komenda Linux file zgłosiła "current ar archive" dla kilku plików z każdego rozszerzenia (.lib lub .a), którego próbowałem.

Powiązane problemy