链接上的未定义符号___gxx_personality_v0

rya*_*n_s 51 c c++ gcc g++

我用这个命令行得到了这个未定义的符号构建:

$ gcc test.cpp
Undefined symbols:
  "___gxx_personality_v0", referenced from:
  etc...
Run Code Online (Sandbox Code Playgroud)

test.cpp很简单,应该很好.这笔交易是什么?

rya*_*n_s 78

使用

g++ test.cpp
Run Code Online (Sandbox Code Playgroud)

相反,因为这是c ++代码.


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

gcc test.cpp -lstdc++
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Pax Diablo:是的,它使用了正确的_compiler_,但是,g ++将libstdc ++传递给链接器,而gcc没有.:-P (13认同)
  • 这不一定是疲倦或愚蠢.我看到很多人回答使用g ++而不是gcc,但这是不好的答案.人们询问和搜索可能没有这种选择.我正在使用具有C和C++版本的库,我正在编写一个C程序.链接到这些库中的一些使我必须链接到stdc ++,我甚至必须使用-L指定在/ usr/lib/gcc中找到它的位置. (9认同)
  • 我自己犯了同样的错误,至少是我记忆中的两倍.:-) (4认同)
  • 我虽然gcc是识别cpp文件并将其传递给正确编译器的前端. (2认同)

gar*_*ois 5

.cpp扩展名会将gcc您的文件编译为 C++ 文件。(请参阅GCC 文档。)

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

mv test.cpp
gcc test.c
Run Code Online (Sandbox Code Playgroud)

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

gcc -x c -c test.cpp -o test.o
Run Code Online (Sandbox Code Playgroud)

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