c++ - libc++abi 未定义符号:_ZTVN10__cxxabiv120__si_class_type_infoE
问题描述
我正在运行 Ubuntu 18.04.1 LTS,并试图让半条命的游戏库在 Xash3D 引擎中运行。它们构建良好,但是当我尝试运行引擎时,出现以下令人困惑的错误:
undefined symbol: _ZTVN10__cxxabiv120__si_class_type_infoE
经过一些互联网研究,我认为这基本上可以解决“VTable for __cxxabiv1::__si_class_type_info
”。我已经安装了libc++abi-dev
、和libc++-dev
,以及它们的 i386 对应项(因为我必须以 32 位编译),所以我不知道为什么运行时链接会失败。libc++abi1
libc++1
如果有帮助,我发现半条命回购中的其他库(特别是 Deathmatch Classic 库)确实有效。我检查了 makefile 和 DMC 库没有任何LDFLAGS
设置,而标准半条命库使用:
LDFLAGS= -lm -lstdc++
有什么理由我应该在这里得到链接器错误?我能做些什么来修复它们?
编辑:我正在使用 GCC/G++ 7.3.0。如果有帮助,我正在使用的库的生成文件在这里:
一个有效的:https ://github.com/ValveSoftware/halflife/blob/master/linux/Makefile.dmcdll
没有的:https ://github.com/ValveSoftware/halflife/blob/master/linux/Makefile.hldll
我还在*_map.txt
编译时生成的文件中搜索了“libc”。这是目前的情况:
在工作 DMC 地图文件中:
Archive member included to satisfy reference by file (symbol)
/usr/lib/i386-linux-gnu/libc_nonshared.a(stack_chk_fail_local.oS)
/home/vesper/Documents/afterburner-game/build/game/obj/dmcdll/animating.o (__stack_chk_fail_local)
As-needed library included to satisfy reference by file (symbol)
libstdc++.so.6 /home/vesper/Documents/afterburner-game/build/game/obj/dmcdll/nodes.o (operator new[](unsigned int)@@GLIBCXX_3.4)
libpthread.so.0 /usr/lib/gcc/x86_64-linux-gnu/7/32/libstdc++.so (write@@GLIBC_2.0)
libc.so.6 /home/vesper/Documents/afterburner-game/build/game/obj/dmcdll/client.o (strcpy@@GLIBC_2.0)
/home/vesper/Documents/afterburner-game/build/game/obj/dmcdll/triggers.o: dynamic relocation against `CTriggerPush::CTriggerPush()' in read-only section `.text._Z11GetClassPtrI12CTriggerPushEPT_S2_[_Z11GetClassPtrI12CTriggerPushEPT_S2_]'
Discarded input sections
...
.group 0x0000000000000000 0x8 /usr/lib/i386-linux-gnu/libc_nonshared.a(stack_chk_fail_local.oS)
.text.__x86.get_pc_thunk.bx
0x0000000000000000 0x4 /usr/lib/i386-linux-gnu/libc_nonshared.a(stack_chk_fail_local.oS)
.note.GNU-stack
0x0000000000000000 0x0 /usr/lib/i386-linux-gnu/libc_nonshared.a(stack_chk_fail_local.oS)
Linker script and memory map
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/../../../i386-linux-gnu/crti.o
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/32/crtbeginS.o
... [Game object files] ...
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/../../../i386-linux-gnu/libdl.so
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/../../../i386-linux-gnu/libpthread.so
START GROUP
LOAD /lib/i386-linux-gnu/libpthread.so.0
LOAD /usr/lib/i386-linux-gnu/libpthread_nonshared.a
END GROUP
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/../../../i386-linux-gnu/libc++abi.so
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/32/libgcc.a
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/32/libgcc_s.so
START GROUP
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/32/libgcc_s.so.1
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/32/libgcc.a
END GROUP
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/../../../i386-linux-gnu/libc.so
START GROUP
LOAD /lib/i386-linux-gnu/libc.so.6
LOAD /usr/lib/i386-linux-gnu/libc_nonshared.a
LOAD /lib/i386-linux-gnu/ld-linux.so.2
END GROUP
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/32/libgcc.a
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/32/libgcc_s.so
START GROUP
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/32/libgcc_s.so.1
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/32/libgcc.a
END GROUP
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/32/crtendS.o
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/../../../i386-linux-gnu/crtn.o
在非工作 HL 映射文件中:
Archive member included to satisfy reference by file (symbol)
/usr/lib/i386-linux-gnu/libc_nonshared.a(stack_chk_fail_local.oS)
/home/vesper/Documents/afterburner-game/build/game/obj/hldll/aflock.o (__stack_chk_fail_local)
As-needed library included to satisfy reference by file (symbol)
libc.so.6 /home/vesper/Documents/afterburner-game/build/game/obj/hldll/client.o (strcpy@@GLIBC_2.0)
/home/vesper/Documents/afterburner-game/build/game/obj/hldll/egon.o: dynamic relocation against `CEgon::UpdateEffect(Vector const&, Vector const&, float)' in read-only section `.text'
...
Linker script and memory map
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/../../../i386-linux-gnu/crti.o
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/32/crtbeginS.o
... [Game object files] ...
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/32/libgcc.a
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/32/libgcc_s.so
START GROUP
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/32/libgcc_s.so.1
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/32/libgcc.a
END GROUP
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/../../../i386-linux-gnu/libc.so
START GROUP
LOAD /lib/i386-linux-gnu/libc.so.6
LOAD /usr/lib/i386-linux-gnu/libc_nonshared.a
LOAD /lib/i386-linux-gnu/ld-linux.so.2
END GROUP
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/32/libgcc.a
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/32/libgcc_s.so
START GROUP
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/32/libgcc_s.so.1
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/32/libgcc.a
END GROUP
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/32/crtendS.o
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/../../../i386-linux-gnu/crtn.o
解决方案
看起来我已经解决了,部分原因是偶然遇到了另一个 StackOverflow 评论。
首先,该项目不包含链接器选项-Wl,--no-undefined
,如果检测到未定义的符号,则不允许编译时链接完成,这将使我的生活更轻松。添加此内容后,我注意到还有找不到数学库函数,并且我遇到了sqrtf undefined reference to `sqrtf' in c 的这个答案。
事实证明,问题在于链接器调用中的目标文件之前指定了要链接的库,并且对上述答案的一条评论指出,这将导致它们被忽略。我将它们移到通话结束时,一切正常。
推荐阅读
- php - 在 Wordpress 仪表板中,如何仅在特定帖子类别中发布特定用户角色?
- html - WKWebView:加载本地html时如何将文本插入HTML
- react-native - 在 API 中将状态作为 id 传递本机反应
- azure-stream-analytics - Azure 流分析测试查询编辑器与 ComosDB 和 Blob 中的最终输出不匹配
- git - 通过 SSH 镜像到 Github 时 Git 挂起
- javascript - 未捕获的类型错误:无法设置未定义选择的 jquery 的属性“选择”
- php - 如果在输入类型文件中没有选择文件,则添加行
- php - 允许匹配 - 特殊字符只能连续出现一次
- excel - 当在 Sheet1 上单击宏按钮时,Excel VBA 代码在 Sheet2 上设置值
- css - 无法修改选项卡指示器颜色