2010-02-25 37 views
29

Sto cercando di compilare staticamente qualcosa e sto cercando di capire come funzionano tutte queste dipendenze. So che i file .dll sono per dipendenze collegate dinamicamente che saranno richieste dall'output finale, ma quali sono i file .a e .lib e quando hai bisogno di ognuno di questi?Qual è la differenza tra i file .lib e .a?

risposta

28

.a è un archivio di codice: compilato ma non collegato. Collegheresti staticamente con esso durante la fase di collegamento finale del tuo programma.

.lib può essere uguale a .a o una magica "libreria di importazione": un segnaposto sottile che richiede di richiedere un file .dll in fase di runtime.

+0

Sto compilando il framework QT con una libreria .a OpenSSL, ma in qualche modo il mio eseguibile finale prodotto da QT richiede ancora una dll OpenSSL esterna per funzionare. Hai idea di come potrebbe essere il caso dato che sto usando una libreria .a? – Nantucket

+0

Come sono stati compilati i contenuti di OpenSSL .a? Come stai collegando il tuo eseguibile finale? – crazyscot

+0

Non sono sicuro di "richiedere un dll in fase di runtime". Non avrai bisogno di .dll se il tuo progetto sta usando librerie statiche .lib (a meno che non ci siano dipendenze .dll che non hai identificato correttamente). – ha9u63ar

4

Di solito, .un è per le librerie statiche in Linux mentre Lib sono per lo stesso, ma su Windows. Ma ovviamente è solo una convenzione.

19

Su sistemi Unix si dispone dei file .a. Si tratta di semplici archivi di file oggetto (.o).

Su Windows, ci sono i file .lib, che sono esattamente la stessa cosa, ma per Windows invece di Unix.

Un'ulteriore sottigliezza è che per collegare un codice a una DLL (su Windows), è necessario eseguire il collegamento a un file .lib che contiene semplici wrapper che invocano la DLL. Sul sistema Unix, tradizionalmente, non c'è bisogno di tali wrapper (il linker è abbastanza intelligente da generarli al volo).

+0

Grazie per questa risposta, ho scoperto che stavo cercando di compilare con una bandiera di Windows da qualche parte! :) –

+0

C'è qualche differenza tra .a creato in windows e unix? – samnaction

5

Qualcosa che non vedo menzionato qui ancora è il fatto sorprendente che, almeno una volta, i file .a e .lib sono in realtà lo stesso formato binario. Anche se non sono riuscito a trovare nulla che dicesse tanto sul sito web di mingw, ho notato che quando cercavo di ottenere il compilatore cl.exe a 64 bit di MS Visual C++ per collegarlo in un file .dll prodotto usando il compilatore g ++ mingw-w64, era felice accettato la linea di comando

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

e il file exe risultante eseguito correttamente non appena ho messo una copia del file dll corrispondente nella directory corrente. (Ha fatto mormorare l'avvertimento "avviso riga di comando D9024: tipo di file sorgente non riconosciuto" percorso \ a \ lib \ gmp-6.0.0 \ lib \ libgmp.dll.a ', file oggetto assunto ".)

Ulteriori prove è che il comando Linux file ha segnalato "archivio corrente ar" per diversi file di ogni estensione (.lib o .a) che ho provato.

Problemi correlati