我想做什么
我尝试将代码分成模块,这些模块被编译为
-fPIC
最后,使用
--whole-archive
,也用
.
在整个编辑过程中,我使用
CMake generated make files
C++17
具有
GCC8
!
问题
GCC8 x86_64
和
libstdc++_pic
失败原因:
/usr/bin/x86_64-linux-gnu-ld:CMakeFiles/shirabeengine.dir/code/source/core/engine.cpp.o:R_x86_64_64_32重新定位到未定义的符号“zn6engineersorks_13eenginestatus”在生成共享对象时不能使用;与-fPIC重新编译
/usr/bin/x86_64-linux-gnu-ld:最终链接失败:错误值
集合2:错误:ld返回1退出状态
执行的步骤
我已经做了一些事情来验证,所有的库都是用
并包含重新定位信息:
-
我打开了所有静态库
ar -x <name>.a
-
我跑了
readelf --relocs <name>.cpp.o | egrep '(GOT|PC|PLT|JU?MP_SLOT)'
查看每个对象文件是否包含重新定位信息。
节选:
0000000000 36 217600004r_X86_64_PLT32 0000000000000000_ZN9_ugnu_cxx17_unorma-4号
0000000000 4E 161000000004 R_X86_64_PLT32 0000000000000000_ustack_chk_fail-4
0000000000 19 2177000000004 R_X86_64_PLT32 0000000000000000_ZNK9_ugnu_cxx17_unorm-4
0000000000 28 2177000000004 R_X86_64_PLT32 0000000000000000_ZNK9_ugnu_cxx17_unorm-4
0000000000 44 1ff70000004 R_X86_64_PLT32 0000000000000000_ZNSt12_矢量基础6-4
0000000000 14 21200000004 R_X86_64_PLT32 0000000000000000_znkste12_ushared_ptrIN-4共享
0000000000 14 217800000004 R_X86_64_PLT32 0000000000000000_ZNSt13_future_base13-4
0000000000 14 21200000004 R_X86_64_PLT32 0000000000000000_znkste12_ushared_ptrIN-4共享
0000000000 25 18b300000004 R_X86_64_PLT32 0000000000000000_ZSt20_uthrow_future_e-4号
0000000 10248 089e0000002 R_X86_64_PC32 0000000000000000.text._ZN9_ugnu_cxxeqI+0
0000000 10268 089f0000002 R_X86_64_PC32 0000000000000000.text.\u ZNSt6vectorIN6e+0
0000000 10271 007f0000002 R_X86_64_PC32 0000000000000000.gcc_除了表+e68
0000000 1028c 08a00000002 R_X86_64_PC32 0000000000000000.text.\u znkste13包+0
0000000 102AC 08a100000002 R_X86_64_PC32 0000000000000000.文本。
+0个
0000000 102cc 08a200000002 R_X86_64_PC32 0000000000000000.text._ZN9_ugnu_cxx17_+0
0000000 102EC 08a300000002 R_X86_64_PC32 0000000000000000.text._ZNK9_ugnu_cxx17+0
-
readelf --debug-dump=macro <name>.o | grep __PIC__
看看,是否
_PIC_
宏已定义并设置为
2
节选:
照片
2个
-
我爬网了50多篇文章,stackoverflow条目和答案,都与.cpp文件中定义的函数/方法相关的未解析符号有关。在我的例子中,它是在头文件中定义的一个符号,这个头文件找不到,这个头文件
结果
所有测试均验证成功
-柔性线路板
唯一不起作用的是:
包括
enum class EEngineStatus
engine
,由链接器错误报告。符号
_ZN6enginelsERSoRKNS_13EEngineStatusE
不包含在受影响的
engine.cpp.o
可疑影响
我将其中一个静态库链接到vulkan SDK,它不是
-柔性线路板
这是否会破坏与vulkan SDK无关的库的整个链接?
帮助
有人知道我做错了什么吗?
我真诚地希望,任何人都能帮忙。
提前谢谢你。
解决方案
原来标题已经处理过了,但我不明白这条消息。
感谢@jww,我学会了如何要求未定义的符号:
echo zn6Engineersorks引擎状态c++过滤器
这导致函数未实现,因此丢失,我能够修复这些问题。