54

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

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

test.cpp 很简单,应该可以正常构建。什么是交易?

4

4 回答 4

89

采用

g++ test.cpp

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


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

gcc test.cpp -lstdc++

在每个场景下运行产生md5a.out结果表明它是相同的输出。

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

于 2008-10-15T02:38:09.393 回答
4

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

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

mv test.cpp
gcc test.c

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

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

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

于 2009-10-26T17:13:21.577 回答
3

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

于 2010-12-02T22:08:38.143 回答
2

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

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

于 2013-08-29T18:38:22.620 回答