【问题标题】:libc++abi undefined symbol: _ZTVN10__cxxabiv120__si_class_type_infoElibc++abi 未定义符号:_ZTVN10__cxxabiv120__si_class_type_infoE
【发布时间】:2018-08-04 22:25:07
【问题描述】:

我正在运行 Ubuntu 18.04.1 LTS,并且正在尝试让半条命的游戏库在 Xash3D 引擎中运行。它们构建良好,但是当我尝试运行引擎时,出现以下令人困惑的错误:

undefined symbol: _ZTVN10__cxxabiv120__si_class_type_infoE

经过一些互联网研究,我认为这基本上可以解决为“__cxxabiv1::__si_class_type_info 的 VTable”。我安装了libc++abi-devlibc++-devlibc++abi1libc++1,以及它们的 i386 对应物(因为我必须以 32 位编译),所以我不知道为什么运行时链接会失败。

如果有帮助,我发现半条命 repo 中的其他库(特别是 Deathmatch Classic 库)确实可以工作。我检查了 makefile 和 DMC 库没有任何 LDFLAGS 集,而标准半条命库使用:

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

【问题讨论】:

  • echo _ZTVN10__cxxabiv120__si_class_type_infoE | c++filt 结果为vtable for __cxxabiv1::__si_class_type_info。您是否包括#include <typeinfo>?你在混合/匹配 GCC 和 Clang 吗?另请参阅si_class_type_info.cc 源代码。
  • 我不确定 typeinfo 包含,但我认为这意味着编译会失败(它在 Ubuntu 上成功,甚至在我的 Mac 上正常运行) - 我会检查一下,尽管。 AFAIK 我没有不匹配 GCC 和 Clang,但我会再看一下。
  • 请准确告诉我们您正在使用哪个编译器的哪个版本。
  • 请不要对此投反对票。没有针对此类错误的其他文档。在这篇文章之后,我能够通过添加 -lstdc++ 链接器标志来解决同样的问题。
  • -lstdc++ 选项对我来说效果很好。

标签: c++ linux linker-errors libc++ ubuntu-18.04


【解决方案1】:

看起来我已经解决了,部分原因是偶然遇到了另一个 StackOverflow 评论。

首先,该项目不包含链接器选项-Wl,--no-undefined,如果检测到未定义的符号,则不允许编译时链接完成,这将使我的生活更轻松。添加此内容后,我注意到还有找不到数学库函数,我遇到了sqrtf undefined reference to `sqrtf' in c 的答案。

事实证明,要链接的库是在链接器调用中的目标文件之前指定的,而对上述答案的一条评论指出,这将导致它们被忽略。我将它们移到通话结束时,一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2012-11-07
    • 2012-09-05
    • 2017-06-25
    相关资源
    最近更新 更多