2008-10-15 212 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修復了問題。