Care este diferența dintre fișierele .lib și .a? (Programare, Extensie De Fișier)

Nantucket a intrebat.

Încerc să compilez static ceva și încerc să înțeleg care sunt toate aceste dependențe. Știu că fișierele .dll sunt pentru dependențele legate dinamic care vor fi necesare pentru rezultatul final, dar ce sunt fișierele .a și .lib și când ai nevoie de fiecare dintre ele?

4 răspunsuri
crazyscot

.a este o arhivă de cod: compilată, dar nu legată. Veți face legătura statică cu el în timpul etapei finale de legătură a programului dvs.

.lib poate fi fie același lucru ca .a, fie o așa-numită „bibliotecă de import” magică: un placeholder subțire care te face să ai nevoie de un .dll la momentul execuției.

Comentarii

  • Compilez cadrul QT cu o bibliotecă OpenSSL .a, dar, cumva, executabilul meu final produs de QT necesită în continuare un dll OpenSSL extern pentru a putea fi rulat. Aveți vreo idee cum ar putea fi acest lucru, având în vedere că folosesc o bibliotecă .a? –  > Por Nantucket.
  • Cum a fost compilat conținutul bibliotecii OpenSSL .a? Cum legați executabilul final? –  > Por crazyscot.
  • Nu sunt sigur de „necesită un .dll la execuție”. Nu veți avea nevoie de .dll dacă proiectul dvs. utilizează biblioteci statice .lib (cu excepția cazului în care există dependențe .dll pe care nu le-ați identificat corect). –  > Por ha9u63ar.
Thomas Pornin

Pe sistemele Unix aveți opțiunea .a fișiere. Acestea sunt simple arhive de fișiere obiect (.o).

Pe Windows, există .lib fișiere, care sunt cam același lucru, dar pentru Windows în loc de Unix.

O subtilitate suplimentară constă în faptul că, pentru a lega un anumit cod de o DLL (pe Windows), trebuie să faceți legătura cu un fișier .lib care conține simple wrappers care invocă DLL-ul. Pe sistemul Unix, în mod tradițional, nu este nevoie de astfel de wrappers (linkerul este suficient de inteligent pentru a le genera din mers).

Comentarii

  • Mulțumesc pentru acest răspuns, am aflat că încercam să compilez cu un flag Windows activat undeva! 🙂 –  > Por SSH Acest lucru.
  • Există vreo diferență între .a creat în windows și unix ? –  > Por samnaction.
  • Am un exemplu aici fără a fi nevoie de un .lib pe o bibliotecă partajată (.dll) în windows: github.com/ConsoleTVs/C_Static_Shared_Libraries –  > Por Erik Campobadal.
j_random_hacker

Ceva ce nu văd încă menționat aici este faptul surprinzător că, cel puțin o parte din timp, fișierele .a și fișierele .lib sunt de fapt același format binar. Deși nu am găsit nimic care să spună acest lucru pe site-ul mingw, am observat că, atunci când am încercat să fac compilatorul pe 64 de biți cl.exe al MS Visual C++ să facă legătura cu un fișier .dll produs cu ajutorul compilatorului mingw-w64 g++, acesta a acceptat cu plăcere linia de comandă

cl /EHsc /Ipathtoinclude gmp_test.cpp pathtoliblibgmp.dll.a

și fișierul .exe rezultat a rulat corect de îndată ce am pus o copie a fișierului .dll corespunzător în directorul curent. (A mormăit însă avertismentul „Command line warning D9024 : unrecognized source file type ‘pathtolibgmp-6.0.0liblibgmp.dll.a’, object file assumed”).

O dovadă în plus este faptul că aplicația Linux file a raportat „current ar archive” pentru mai multe fișiere cu fiecare extensie (.lib sau .a) pe care le-am încercat.

jldupont

De obicei, .a este pentru biblioteci statice în Linux, în timp ce .lib sunt pentru același lucru, dar pe Windows. Dar, desigur, este doar o convenție.