2009-12-27 16 views
5

scuso perché per il momento non ho l'ambiente di sperimentare e risolvere le seguenti domande me stesso:Domande su GCC linker

1) Diciamo che ho quattro file di libreria: libmylib_super.a e libmylib_super.so, mylib_dumb.a e mylib_dumb.so . Mentre specificando librerie per collegare, quali sono le differenze tra i seguenti approcci:

A) -l:libmylib_super.a
B) -llibmylib_super
C) -lmylib_super
D) -lmylib_dumb

2) Definizione di -static dalla pagina man :

Sui sistemi che supportano il collegamento dinamico , questo impedisce il collegamento con h le librerie condivise. Su altri sistemi , questa opzione non ha alcun effetto.

Questa opzione di linker ha qualcosa a che fare con la domanda n. 1? O ... per caso interferiranno l'uno con l'altro?

Grazie.

--- --- a cura 2009-12-28

Ho appena ricevuto il mio ambiente e sperimentare un po ', collegando per amplificare il DATE_TIME biblioteca. Supponiamo di avere tre file di libreria: libboost_date_time-mt-d.a, libboost_date_time-mt-d.so.1.41.0, libboost_date_time-mt-d.so -> libboost_date_time-mt-d.so.1.41.0 (collegamento simbolico).

A.1) -l:libboost_date_time-mt-d.a ==> collegamento OK, binario funziona anche senza il file di libreria.
A.2) -l:libboost_date_time-mt-d.a con -static ==>collega errore/usr/bin/ld: cannot find -lm

C.1) -lboost_date_time-mt-d ==> che collega OK, opere binari ma richiede il file di libreria condivisa.
C.2) -lboost_date_time-mt-d con -static ==>collega errore/usr/bin/ld: cannot find -lm

Qualsiasi idea sull'errore in A.2 e C.2?

Inoltre, durante l'esecuzione del programma in C.1, sembra cercare il file della libreria condivisa con il nome libboost_date_time-mt-d.so.1.41.0 ma non lo libboost_date_time-mt-d.so. Non sarebbe scomodo se il programma è in esecuzione su un sistema senza la versione esatta della libreria? Quale potrebbe essere il modo pratico per gestire la versione durante l'utilizzo della libreria condivisa?

risposta

9

Secondo il manuale,

A) ricerche il percorso della libreria di un file chiamato esattamente libmylib_super.a (la ricerca prima per un comportamento libreria condivisa non si applica)

B) ricerche nel percorso della libreria un file chiamato liblibmylib_super.so prima poi liblibmylib_super.a o solo ricerche per un file chiamato liblibmylib_super.a se -static viene utilizzato - nota è il linker che aggiunge il prefisso lib e l'estensione del file

C) cerca il percorso della libreria per un file chiamato libmylib_super.so prima poi libmylib_super.a o solo ricerche per un file chiamato liblibmylib_super.so se -static viene utilizzato

D) vedi C)

Nota che B) non funziona perché è il linker che dovrebbe aggiungere il prefisso lib a il nome della biblioteca.

Nota che D) non funzionerà perché il tuo mylib_dumb non segue la convenzione di denominazione.

Vedere il GNU Linker Manual:

namespec -l

--library = namespec

aggiungere il file di archivio o oggetto specificato dal namespec alla lista dei file da collegare. Questa opzione può essere utilizzata qualsiasi numero di volte. Se namespec è nella forma: filename, ld cercherà il percorso della libreria per un file chiamato filename, altrimenti cercherà il percorso della libreria per un file chiamato libnamespec.a.

Sui sistemi che supportano le librerie condivise, ld può anche cercare file diversi da libnamespec.a. In particolare, sui sistemi ELF e SunOS, ld cercherà una directory per una libreria chiamata libnamespec.so prima di cercarne una chiamata libnamespec.a. (Per convenzione, un'estensione .so indica una libreria condivisa.) Si noti che questo comportamento non si applica a: filename, che specifica sempre un file chiamato filename.

Il linker cercherà un archivio solo una volta, nel punto in cui è specificato sulla riga di comando. Se l'archivio definisce un simbolo che non era definito in qualche oggetto che appariva prima dell'archivio sulla riga di comando, il linker includerà i file appropriati dall'archivio. Tuttavia, un simbolo indefinito in un oggetto che appare in seguito sulla riga di comando non farà in modo che il linker cerchi di nuovo nell'archivio.

Vedere il - (opzione per un modo per forzare il linker agli archivi cercare più volte

Si possono elencare lo stesso archivio più volte sulla linea di comando

Questo tipo di ricerca di archivio è di serie.. Per i linker Unix, tuttavia, se si utilizza ld su AIX, notare che è diverso dal comportamento del linker AIX

+0

Correzione: quando viene specificato '-static', verrà cercato solo' .a' , non '.so' – iamamac

+0

oops si grazie! –

+0

Puoi trovare m informazioni sulle varie opzioni disponibili su questo sito: http://gcc.gnu.org/onlinedocs/gcc/ –