如何将档案的所有对象包含在共享对象中?
- 2024-10-28 08:37:00
- admin 原创
- 67
问题描述:
在编译我们的项目时,我们创建几个档案(静态库),比如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
知道这是从哪里来的吗?
解决方案 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
图书馆列表的末尾。(正如 Dmitry Yudakov 在下面的评论中所说)
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD