2010-05-04 11 views
13

Durante la compilazione del nostro progetto, creiamo diversi archivi (librerie statiche), diciamo liby.a e libz.a che contengono ciascuno un file oggetto che definisce una funzione y_function() e z_function(). Quindi, questi archivi sono uniti in un oggetto condiviso, ad esempio libyz.so, che è uno dei nostri principali obiettivi distribuibili.Come includere tutti gli oggetti di un archivio in un oggetto condiviso?

g++ -fPIC -c -o y.o y.cpp 
ar cr liby.a y.o 
g++ -fPIC -c -o z.o z.cpp 
ar cr libz.a z.o 
g++ -shared -L. -ly -lz -o libyz.so 

Quando si utilizza questo oggetto condiviso nel programma esempio, dicono x.c, il collegamento non riesce a causa di un non definiti i riferimenti alle funzioni y_function() e z_function().

g++ x.o -L. -lyz -o xyz 

Funziona tuttavia quando collego l'eseguibile finale direttamente con gli archivi (librerie statiche).

g++ x.o -L. -ly -lz -o xyz 

La mia ipotesi è che i file oggetto contenuti negli archivi non sono collegati nella libreria condivisa in quanto non vengono utilizzati in esso. Come forzare l'inclusione?

Edit:

inclusione può essere forzata usando --whole-archivio ld opzione. Ma se i risultati in errori di compilazione:

g++ -shared '-Wl,--whole-archive' -L. -ly -lz -o libyz.so 
/usr/lib/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init': 
(.text+0x1d): undefined reference to `__init_array_end' 
/usr/bin/ld: /usr/lib/libc_nonshared.a(elf-init.oS): relocation R_X86_64_PC32 against undefined hidden symbol `__init_array_end' can not be used when making a shared object 
/usr/bin/ld: final link failed: Bad value 

Qualche idea da dove proviene?

risposta

18

Si potrebbe provare (ld (2)):

--whole-archive 
     For each archive mentioned on the command line after the --whole-archive option, include every object file in the 
     archive in the link, rather than searching the archive for the required object files. This is normally used to turn 
     an archive file into a shared library, forcing every object to be included in the resulting shared library. This 
     option may be used more than once. 

(gcc -Wl, - intero archivio)

Inoltre, si dovrebbe mettere -Wl,--no-whole-archive alla fine della lista biblioteca. (come detto da Dmitry Yudakov nel commento qui sotto)

+0

Grazie, questo sembra quello che sto cercando, ma genera un errore di collegamento Non riesco a capire da dove proviene. Ho aggiunto dettagli nella domanda. –

+2

c'è la nota importnat in 'man ld' per questa opzione: non dimenticare di usare -Wl, -no-whole-archive dopo il tuo elenco di archivi, perché gcc aggiungerà il proprio elenco di archivi al tuo link e non potrai voglio che questa bandiera abbia effetto anche su quelle –

Problemi correlati