2008-10-15 207 views
43

我已经得到使用此命令行这种不确定的标志性建筑:未定义的符号___gxx_personality_v0链路

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

TEST.CPP简单,应该建立罚款。这笔交易是什么?

+0

如果不是太长,我们可以查看代码吗? – jjnguy 2008-10-15 02:38:30

回答

73

使用

g++ test.cpp 

代替,因为这是C++代码。


或者,如果你真的想用gcc,添加-lstdc++到命令行,像这样:

gcc test.cpp -lstdc++ 

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

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

+2

虽然gcc是识别cpp文件的前端,并将其传递给正确的编译器。 – paxdiablo 2008-10-15 02:41:38

+13

@Pax暗黑破坏神:是的,它使用了正确的_compiler_,但是,g ++将libstdC++传递给链接器,而gcc则没有。 :-P – 2008-10-15 02:43:24

3

.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区分大小写)。

1

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

C++代码在静态库得到的联系,并通过一个.m文件被引用。将.m文件重命名为.mm修复了问题。