当编译我们的项目,我们创建几个档案(静态库),说liby.a和libz.a每个包含定义函数的对象文件y_function()和z_function()。然后,将这些归档文件合并到一个共享对象中,例如libyz.so,这是我们的主要可分发目标之一。
liby.a
libz.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()。
x.c
g++ x.o -L. -lyz -o xyz
但是,当我直接将最终的可执行文件与归档文件(静态库)链接时,它可以工作。
g++ x.o -L. -ly -lz -o xyz
我的猜测是,归档中包含的目标文件未 链接 到共享库中,因为它们没有在共享库中使用。如何强制包容?
编辑:
可以使用–whole-archive ld选项强制包含。但是如果导致编译错误:
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
知道这来自哪里吗?
您可以尝试(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在库列表的末尾。(如德米特里·尤达科夫在下面的评论中所述)
-Wl,--no-whole-archive