Come includere tutti gli oggetti di un archivio in un object condiviso?

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

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

Quando si utilizza questo object condiviso nel programma di esempio, ad esempio xc , il collegamento non riesce a causa di riferimenti indefiniti alle funzioni y_function() e z_function() .

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

Funziona comunque quando collego l’eseguibile finale direttamente con gli archivi (librerie statiche).

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

La mia ipotesi è che i file object contenuti negli archivi non siano collegati nella libreria condivisa perché non vengono utilizzati al suo interno. Come forzare l’inclusione?

Modificare:

L’inclusione può essere forzata usando l’opzione –whole-archive ld . Ma se i risultati negli 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 viene questo?

Potresti 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, dovresti inserire -Wl,--no-whole-archive alla fine dell’elenco delle librerie. (come ha detto Dmitry Yudakov nel commento qui sotto)