web-dev-qa-db-ja.com

リンク上の未定義のシンボル___gxx_personality_v0

私はこの未定義のシンボルをこのコマンドラインでビルドしています:

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

test.cppはシンプルで問題なくビルドできるはずです。契約は何ですか?

50
ryan_s

使用する

g++ test.cpp

代わりに、これはC++コードなので。


または、本当にgccを使用する場合は、次のように-lstdc++をコマンドラインに追加します。

gcc test.cpp -lstdc++

各シナリオで生成されたmd5に対してa.outを実行すると、同じ出力であることを示しています。

しかし、そうです、g++はおそらくあなたの世界をよりシンプルな場所にするでしょう。

77
ryan_s

.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シンボルが存在します。)

4
garageàtrois

誰かが私と同じ問題を抱えている場合に備えて:ファイル拡張子は.cない.C(gccでは大文字と小文字が区別されます)。

3
inket

同じ問題がありましたが、別の解決策がありました:

静的ライブラリのC++コードがリンクされ、.mファイルによって参照されます。 .mファイルの名前を.mmに変更すると、問題が修正されました。

1
BadPirate