2010-12-12 23 views
12

Questa è una citazione dal libro di programmazione Linux:come forzare il linker ad usare la libreria condivisa invece della libreria statica?


% gcc -o app app.o -L. –ltest

Supponiamo che sia libtest.a e libtest.so sono available.Then il linker deve scegliere una delle librerie e non il contrario . Il linker cerca ogni directory (prima quelle specificate con le opzioni -L e poi quelle nelle directory standard). Quando il linker trova un di rectory che contiene libtest.a o libtest.so, il linker interrompe le directory di ricerca . Se solo una delle due varianti è presente nella directory, il linker sceglie tale variante. In caso contrario, il linker sceglie la versione della libreria condivisa, a meno che non sia stato specificato esplicitamente in . È possibile utilizzare l'opzione -static per richiedere gli archivi statici . Ad esempio, la seguente riga utilizzerà l'archivio libtest.a, anche se il libtest.so libreria condivisa è disponibile anche:

% gcc -static -o app app.o -L. –ltest


Poiché se il linker incontra la directory che contiene libtest.a si ferma di ricerca e gli usi quella libreria statica, come forzare il linker a cercare solo la libreria condivisa e non a statica?

% gcc -o app app.o -L. libtest.so?

risposta

14

Si potrebbe utilizzare -l opzione nella sua forma -l:filename se il linker lo supporta (vecchie versioni di ld no)

gcc -o app app.o -L. -l:libtest.so 

Altra opzione è quella di utilizzare direttamente il nome del file senza -l e -L

gcc -o app app.o /path/to/library/libtest.so 
+0

Nota: questo uso di '-l' non è documentato. Includerà il percorso completo della libreria nell'eseguibile, il che significa che la libreria non può mai essere spostata dalla sua posizione corrente. –

+1

L'opzione @KevinPanko '-l' è documentata in' man ld', https: //linux.die.net/man/1/ld - Non posso testarlo facilmente ma secondo il doc: Se namespec è nella forma ': filename',' ld' cercherà il percorso della libreria per un file chiamato 'filename'. Come ho già detto, le versioni precedenti di 'ld' non supportano questa opzione. –

+0

Stavo controllando la documentazione di 'gcc' qui: [Opzioni per il collegamento] (https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html) –

0

dall'uomo:

-shared-libgcc
-static-libgcc
Su sistemi che forniscono libgcc come libreria condivisa, queste opzioni forzare l'uso di una versione condivisa o statico, rispettivamente, . Se non è stata creata alcuna versione condivisa di libgcc quando il compilatore è stato configurato, queste opzioni non hanno alcun effetto.

buona fortuna

+5

non è t cappello solo per libgcc? non risolve il problema per altre librerie –

+0

sì, è colpa mia. puoi scrivere il libname.so per collegarlo come ha detto kobac, grazie per la correzione – Aboelnour

Problemi correlati