代码之家  ›  专栏  ›  技术社区  ›  MABVT

将静态库链接到共享:头中的枚举类->根据未定义的符号重新定位R_X86_64_PC32

  •  2
  • MABVT  · 技术社区  · 7 年前

    我想做什么

    我尝试将代码分成模块,这些模块被编译为 -fPIC

    最后,使用 --whole-archive ,也用 .

    在整个编辑过程中,我使用 CMake generated make files C++17 具有 GCC8 !

    enter image description here

    问题

    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退出状态


    执行的步骤

    我已经做了一些事情来验证,所有的库都是用 并包含重新定位信息:

    1. 我打开了所有静态库 ar -x <name>.a
    2. 我跑了 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

    1. readelf --debug-dump=macro <name>.o | grep __PIC__ 看看,是否 _PIC_ 宏已定义并设置为 2

    节选:

    照片 2个

    1. 我爬网了50多篇文章,stackoverflow条目和答案,都与.cpp文件中定义的函数/方法相关的未解析符号有关。在我的例子中,它是在头文件中定义的一个符号,这个头文件找不到,这个头文件

    结果

    所有测试均验证成功 -柔性线路板

    唯一不起作用的是: 包括 enum class EEngineStatus engine ,由链接器错误报告。符号 _ZN6enginelsERSoRKNS_13EEngineStatusE 不包含在受影响的 engine.cpp.o


    可疑影响

    我将其中一个静态库链接到vulkan SDK,它不是 -柔性线路板

    这是否会破坏与vulkan SDK无关的库的整个链接?


    帮助

    有人知道我做错了什么吗?

    我真诚地希望,任何人都能帮忙。

    提前谢谢你。

    解决方案

    原来标题已经处理过了,但我不明白这条消息。

    感谢@jww,我学会了如何要求未定义的符号:

    echo zn6Engineersorks引擎状态c++过滤器

    这导致函数未实现,因此丢失,我能够修复这些问题。

    0 回复  |  直到 7 年前