我用这个命令行得到了这个未定义的符号:
$ gcc test.cpp
Undefined symbols:
"___gxx_personality_v0", referenced from:
etc...
test.cpp很简单,应该可以正常构建。这笔交易是什么?
答案 0 :(得分:77)
使用
g++ test.cpp
相反,因为这是c ++代码。
或者,如果确实想要使用gcc
,请在命令行中添加-lstdc++
,如下所示:
gcc test.cpp -lstdc++
针对每个方案下生成的md5
运行a.out
,表明它的输出相同。
但是,是的,g++
可能会让你的世界变得更加简单。
答案 1 :(得分:4)
.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
符号。)
答案 2 :(得分:3)
万一有人遇到与我相同的问题:文件扩展名应为.c
而不是.C
(gcc区分大小写)。
答案 3 :(得分:1)
有同样的问题,但有不同的解决方案:
静态库中的C ++代码被链接,并被.m文件引用。将.m文件重命名为.mm可以解决问题。