链接上未定义的符号 ___gxx_personality_v0

Posted

技术标签:

【中文标题】链接上未定义的符号 ___gxx_personality_v0【英文标题】:Undefined Symbol ___gxx_personality_v0 on link 【发布时间】:2008-10-15 02:36:38 【问题描述】:

我一直在用这个命令行构建这个未定义的符号:

$ gcc test.cpp
Undefined symbols:
  "___gxx_personality_v0", referenced from:
  etc...

test.cpp 很简单,应该可以很好地构建。什么交易?

【问题讨论】:

【参考方案1】:

使用

g++ test.cpp

相反,因为这是 C++ 代码。


或者,如果您真的想使用gcc,请将-lstdc++ 添加到命令行,如下所示:

gcc test.cpp -lstdc++

针对每个场景下生成的a.out 运行md5 表明它是相同的输出。

但是,是的,g++ 可能会让你的世界变得更简单。

【讨论】:

我认为 gcc 是识别 cpp 文件并将其传递给正确编译器的前端。 @Pax Diablo:是的,它使用正确的编译器,但是,g++ 将 libstdc++ 传递给链接器,而 gcc 没有。 :-P 对,这是链接器问题,而不是编译问题。我通常不会像这样从命令行构建单个文件,所以我什至没有想到,只是输入 gcc 认为它会起作用。 我自己也犯过同样的错误,至少我记得两次。 :-) 这不一定是疲倦或愚蠢。我看到很多人回答使用 g++ 而不是 gcc,但这是一个糟糕的答案。询问和搜索的人可能没有这个选择。我正在使用具有 C 和 C++ 版本的库,并且正在编写一个 C 程序。链接到其中一些库使我不得不链接到 stdc++,我什至不得不用 -L 指定在 /usr/lib/gcc 中的何处找到它。【参考方案2】:

.cpp 扩展使gcc 将您的文件编译为 C++ 文件。 (见GCC docs。)

尝试编译相同的文件,但将其重命名为具有.c 扩展名:

mv test.cpp
gcc test.c

或者,您可以通过将-x c 传递给编译器来显式指定语言:

gcc -x c -c test.cpp -o test.o

如果您在这些 C 语言版本上运行 nm test.o,您会注意到 ___gxx_personality_v0 未作为符号列出。 (如果您对使用gcc -c test.cpp -o test.o 生成的目标文件运行相同的命令,则会出现___gxx_personality_v0 符号。)

【讨论】:

【参考方案3】:

以防万一有人和我有同样的问题:文件扩展名应该是 .c 而不是 .C(gcc 区分大小写)。

【讨论】:

这是因为 .C 文件被 cpp 识别。例如,在 CMake 中也是如此。【参考方案4】:

遇到同样的问题,但解决方案不同:

静态库中的 C++ 代码被链接,并被 .m 文件引用。将 .m 文件重命名为 .mm 可解决此问题。

【讨论】:

以上是关于链接上未定义的符号 ___gxx_personality_v0的主要内容,如果未能解决你的问题,请参考以下文章

Apple Mach-O 链接器错误 - 架构 x86_64 的未定义符号:“_UISceneWillEnterForegroundNotification”和“___isPlatformVersio

未定义符号:__gnat_rcheck_CE_Invalid_Data 将 ADA 与 C++ 链接时

应用程序在链接描述文件中定义的访问符号

XCode 7 / Cordova 插件 / 链接问题:_utf8_nextCharSafeBody 未定义符号

Android_Beta 测试_在此服务器上未找到请求的 URL

链接时未定义引用符号'socket@GLIBC_2.4'