Domanda

Apologize perché per il momento non ho l'ambiente di sperimentare e risolvere le seguenti domande me stesso:

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:

  

Su sistemi che supportano dinamica   il collegamento, questo impedisce il collegamento con   le librerie condivise. D'altra   sistemi, questa opzione non ha alcun effetto.

Questo opzione del linker ha nulla a che fare con la domanda # 1? Oppure ... per caso faranno interferire tra loro?

Grazie.

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

Ho appena ricevuto il mio ambiente e sperimentare un po ', collegando per amplificare il DATE_TIME biblioteca. Dire che ho 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 (link MGS)

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

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

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

È stato utile?

Soluzione

Secondo il manuale,

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

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

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

D) vedi C)

Si noti che B) non funziona perché è il linker che dovrebbe aggiungere il prefisso lib per il nome della libreria.

Si noti che D) non funziona perché il mylib_dumb non segue la convenzione di denominazione.

Vedere la Manuale GNU Linker :

  

-l namespec

     

- biblioteca = namespec

     

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

     

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

     

Il linker cercherà un archivio solo una volta, nel punto in cui è specificato nella riga di comando. Se l'archivio definisce un simbolo che è stato indefinito in un oggetto che è apparso prima l'archivio sulla riga di comando, il linker includerà il file appropriato (s) dall'archivio. Tuttavia, un simbolo indefinito in un oggetto che compare in seguito sulla riga di comando non causerà il linker per cercare di nuovo l'archivio.

     

Vedere la -. (Opzione di un modo per forzare il linker a cercare gli archivi più volte

     

È possibile elencare lo stesso archivio più volte sulla riga di comando.

     

Questo tipo di ricerca di archivio è standard per linker Unix. Tuttavia, se si utilizza ld su AIX, si noti che è diverso dal comportamento del linker AIX.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top