如何在共享对象中包含存档的所有对象?

时间:2010-05-04 09:00:19

标签: linux gcc linker archive

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

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

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

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

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

g++ x.o -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

知道这是从哪里来的吗?

1 个答案:

答案 0 :(得分:19)

你可以尝试(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, - full-archive)

另外,您应该将-Wl,--no-whole-archive放在库列表的末尾。 (正如Dmitry Yudakov在下面的评论中所说的那样)