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?
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. –
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 –