私はこのコマンドラインでこの未定義のシンボルを構築しています:
$ 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 のドキュメントを参照してください。)
同じファイルをコンパイルしてみてください。ただし、名前を変更して.c拡張子を付けます。
mv test.cpp
gcc test.c
-x cまたは、コンパイラに渡して言語を明示的に指定することもできます。
gcc -x c -c test.cpp -o test.o
これらの C 言語バージョンで実行すると、 がシンボルとしてリストされていないnm test.oことに気付くでしょう。
(また、 で生成されたオブジェクト ファイルに対して同じコマンドを実行すると、シンボルが存在します。)___gxx_personality_v0gcc -c test.cpp -o test.o___gxx_personality_v0
誰かが私と同じ問題を抱えている場合に備えて: ファイル拡張子は a では.cない必要があります.C(gcc では大文字と小文字が区別されます)。
同じ問題がありましたが、別の解決策がありました:
スタティック ライブラリ内の C++ コードがリンクされ、.m ファイルによって参照されます。.m ファイルの名前を .mm に変更すると、問題が修正されました。