【发布时间】:2011-02-15 09:05:47
【问题描述】:
在编译我们的项目时,我们创建了几个存档(静态库),比如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() 的引用,链接失败。
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
知道这是从哪里来的吗?
【问题讨论】: