小编典典

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

linux

当编译我们的项目,我们创建几个档案(静态库),说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

知道这来自哪里吗?


阅读 287

收藏
2020-06-02

共1个答案

小编典典

您可以尝试(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在库列表的末尾。(如德米特里·尤达科夫在下面的评论中所述)

2020-06-02