私はこのコマンドラインでこの未定義のシンボルを構築しています:
$ 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_v0
gcc -c test.cpp -o test.o
___gxx_personality_v0
誰かが私と同じ問題を抱えている場合に備えて: ファイル拡張子は a では.c
ない必要があります.C
(gcc では大文字と小文字が区別されます)。
同じ問題がありましたが、別の解決策がありました:
スタティック ライブラリ内の C++ コードがリンクされ、.m ファイルによって参照されます。.m ファイルの名前を .mm に変更すると、問題が修正されました。