私はこの未定義のシンボルをこのコマンドラインでビルドしています:
$ gcc test.cpp
Undefined symbols:
"___gxx_personality_v0", referenced from:
etc...
test.cppはシンプルで問題なくビルドできるはずです。契約は何ですか?
使用する
g++ test.cpp
代わりに、これはC++コードなので。
または、本当にgcc
を使用する場合は、次のように-lstdc++
をコマンドラインに追加します。
gcc test.cpp -lstdc++
各シナリオで生成されたmd5
に対してa.out
を実行すると、同じ出力であることを示しています。
しかし、そうです、g++
はおそらくあなたの世界をよりシンプルな場所にするでしょう。
.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
シンボルが存在します。)
誰かが私と同じ問題を抱えている場合に備えて:ファイル拡張子は.c
ない.C
(gccでは大文字と小文字が区別されます)。
同じ問題がありましたが、別の解決策がありました:
静的ライブラリのC++コードがリンクされ、.mファイルによって参照されます。 .mファイルの名前を.mmに変更すると、問題が修正されました。