libc++abi未定义符号:_ZTVN10__cxxabif120__si-class_type_infoE
libc++abi undefined symbol: _ZTVN10__cxxabiv120__si_class_type_infoE
我正在运行Ubuntu 18.04.1 LTS,并试图让Half-Life的游戏库在Xash3D引擎中运行。他们构建得还可以,但当我尝试运行引擎时,我会遇到以下令人困惑的错误:
undefined symbol: _ZTVN10__cxxabiv120__si_class_type_infoE
经过一点互联网研究,我认为这基本上解决了"适用于__cxxabiv1::__si_class_type_info
的VTable"。我安装了libc++abi-dev
、libc++-dev
、libc++abi1
和libc++1
,以及它们的i386对应程序(因为我必须用32位编译(,所以我不知道为什么运行时链接会失败。
如果有帮助的话,我发现《半条命》回购中的其他库(特别是《死亡竞赛经典》中的库(也能起作用。我已经检查了makefile,DMC库没有任何LDFLAGS
集,而标准的Half-Life库使用:
LDFLAGS= -lm -lstdc++
有什么理由让我在这里得到链接器错误吗?我能做些什么来修复它们?
编辑:我使用的是GCC/G++7.3.0。如果有帮助的话,我使用的库的makefile在这里:
有效的: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对"sqrtf';c.
事实证明,问题是要链接的库是在链接器调用中的对象文件之前指定的,上面回答的一条注释指出,这会导致它们被忽略。我把它们移到通话的最后,一切都很顺利。
- unordered_set .find 方法无法编译的 C++ "expression must have class type"错误
- 调用 list.size() 方法给出错误"expression must have class type"
- 为什么我会收到"Expression must have a class type"错误?(C++)
- 让编译器告诉哪些方法不具体,而不是错误'invalid new-expression of abstract class type'
- 仅当链接函数 C++ 时,才会发生"Expression must have class type error"
- 错误 - "expression must have a class type" - c++
- "Expression must have class type"错误
- C++模板"class type"错误
- 使用带有对象的数组调用类中的方法,错误"non-class type",c++
- "Allocating an object of abstract class type"错误,尽管所有函数都有实现
- deque.push_front() 给出错误"expression must have class type"
- "does not have a class type"错误
- C++:离奇发生的"Request for member X of Y which is of non-class type Z"
- 如何处理"class type redefinition"
- 这个错误是什么意思" expression must have pointer-to-class type"?
- 错误是什么意思"expression must have class type"?
- 夏亚"Expression Must Have A Class Type"
- 链表函数 C++ "which is of non-class type 'int'" ?
- shared_ptr : "call of an object of a class type without appropriate operator() or conversion functio
- "Expression must have class type" 错误,尝试调用类函数