如何将共享对象中的所有对象归档?

在编译我们的项目时,我们创build了几个档案(静态库),比如liby.alibz.a ,每个档案都包含一个定义函数y_function()z_function()的对象文件。 然后,这些档案被join一个共享对象,比如libyz.so ,这是我们主要的可分配目标之一。

 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 

在示例程序中使用此共享对象时,如xc ,由于未定义的函数y_function()z_function()引用,链接将失败。

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

但是,当我将最终的可执行文件直接链接到存档(静态库)时,它可以正常工作。

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

我的猜测是,包含在档案中的目标文件没有链接到共享库,因为它们没有被使用。 如何强制包容?

编辑:

包含可以使用–whole-archive ld选项强制。 但是,如果编译错误的结果:

 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 

任何想法,这是从哪里来的?

Solutions Collecting From Web of "如何将共享对象中的所有对象归档?"

你可以试试(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, – 整个档案)

另外,您应该在库列表的末尾放置-Wl,--no-whole-archive 。 (正如德米特里·尤达科夫在下面的评论中所说的那样)