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
.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.
Zazwyczaj .a jest dla bibliotek statycznych pod Linuksem natomiast lib są za takie same, ale w systemie Windows. Ale oczywiście to tylko konwencja.
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).
Dziękuję za tę odpowiedź, dowiedziałem się, że próbowałem skompilować się gdzieś z flagą Windowsa! :) –
Czy jest jakaś różnica między .a stworzony w systemie Windows i UNIX? – samnaction
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.
- 1. Jaka jest różnica między "ignorowanymi plikami" IntelliJ a .gitignore
- 2. Jaka jest różnica między słownikiem a tablicą?
- 3. Jaka jest różnica między plikami .LIB i .OBJ? (Visual Studio C++)
- 4. Jaka jest różnica między plikami ELF i bin?
- 5. Jaka jest różnica między plikami Pyc i Pyo w Pythonie?
- 6. Jaka jest różnica między plikami .class i .dex?
- 7. jaki jest pożytek z .exp i jaka jest różnica między .lib a .dll
- 8. Jaka jest różnica między „$ a” i $ a w Uniksie
- 9. Jaka jest różnica między? : i ||
- 10. Jaka jest różnica między tasklet a workqueue
- 11. Jaka jest różnica między IEnumerable a tablicami?
- 12. Jaka jest różnica między kluczem a KeySpec?
- 13. Jaka jest różnica między UIViewController a UITableViewController
- 14. Jaka jest różnica między PTHREAD_RECURSIVE_MUTEX_INITIALIZER a PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP?
- 15. Jaka jest różnica między kulturą a UICulture?
- 16. Jaka jest różnica między Progressbar a progressDialog?
- 17. Jaka jest różnica między Listą a ArrayList?
- 18. Jaka jest różnica między MongoTemplate a MongoRepository?
- 19. Jaka jest różnica między @android a android:
- 20. Jaka jest różnica między krotką a kompresją?
- 21. Jaka jest różnica między macierzą a tablix?
- 22. Jaka jest różnica między JavaBean a POJO?
- 23. Jaka jest różnica między [niezdefiniowanym] a [,]?
- 24. Jaka jest różnica między kotem a nadrukiem?
- 25. Jaka jest różnica między oracle.jdbc.xa.client.OracleXADataSource a oracle.jdbc.pool.OracleDataSource
- 26. Jaka jest różnica między UseCase a Workflow?
- 27. Jaka jest różnica między cat_id a term_id?
- 28. Jaka jest różnica między stelażem a pasażerem?
- 29. Jaka jest różnica między FreeGLUT a GLFW?
- 30. Jaka jest różnica między GEM_HOME a GEM_PATH?
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
W jaki sposób zostały skompilowane zawartość OpenSSL .a? W jaki sposób łączysz swój końcowy plik wykonywalny? – crazyscot
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