作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在编译我们的项目时,我们创建了几个文件(静态库),例如 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() 的 undefined reference ,链接失败
。
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
知道这是从哪里来的吗?
最佳答案
你可以试试 (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,--whole-archive)
另外,您应该将 -Wl,--no-whole-archive
放在库列表的末尾。 (正如 Dmitry Yudakov 在下面的评论中所说)
关于linux - 如何将存档的所有对象包含在共享对象中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2763988/
我是一名优秀的程序员,十分优秀!