web-dev-qa-db-ja.com

_Unwind_Resumeおよび__gxx_personality_v0への未定義の参照

JsonCppライブラリを使おうとしています。私はWindowsを使用しており、MinGWとCodeBlocksを使用しています。

Jsonヘッダーから何かを含めると、リンカーが内破し、この2つのエラーを出します。私は周りを見回し始めました、そして私は基本的に私の問題を説明するこれらの他の2つの質問を見つけました:

g ++および "` __gxx_personality_v0 'への未定義の参照 "の問題

__ gxx_personality_v0の目的は何ですか?

そして、以下のように、2つの欠落している変数をvoidポインターとして宣言すると、問題は解決します。

void * __gxx_personality_v0=0;
void * _Unwind_Resume =0;

ただし、なぜこのエラーが発生するのかわかりません。 CodeBlocksは、cppファイルにmigw32-g ++を使用するように設定されており、-lstdc ++オプションを追加しても問題は解決しません。オプション-fno-exceptionもありません(例外が必要です、気をつけてください、私はただ試していました)。

同じファイルにブーストライブラリも含めていますが、問題は発生しません。

編集:

エラー出力は、私のタイトルで言ったとおりです。リンク中に、_Unwind_Resumeと__gxx_personality_v0への未定義の参照が合計22個表示されます。私のコードは:

#include <boost/algorithm/string.hpp>
#include <include/json/value.h>
//void * __gxx_personality_v0=0;
//void * _Unwind_Resume =0;
int main () {
    std::string str1("Hello world!");
    boost::to_upper(str1);
    Json::Value k;
    return 0;
}

このエラーは、JsonCPPライブラリをインクルード/使用した場合にのみ発生します。コメント行のコメントを解除すると、問題が修正されます。

コマンドライン出力は次のとおりです。

mingw32-g++.exe -Wall -fexceptions  -g  -DSFML_DYNAMIC   -IC:\Users\Svalorzen\Documents\Projects\boost_1_49 -IC:\Users\Svalorzen\Documents\Projects\jsoncpp-src-0.5.0 -IC:\Users\Svalorzen\Documents\Projects\SFML-1.6\include -IC:\Users\Svalorzen\Documents\Projects\hge181\include  -c C:\Users\Svalorzen\Documents\Projects\test\main.cpp -o obj\Debug\main.o
mingw32-g++.exe -LC:\Users\Svalorzen\Documents\Projects\jsoncpp-src-0.5.0 -LC:\Users\Svalorzen\Documents\Projects\SFML-1.6\lib -LC:\Users\Svalorzen\Documents\Projects\hge181\lib  -o bin\Debug\test.exe obj\Debug\main.o   -fno-exceptions -lsfml-graphics -lsfml-window -lsfml-system  C:\Users\Svalorzen\Documents\Projects\jsoncpp-src-0.5.0\libs\mingw\libjson_mingw_libmt.a C:\Users\Svalorzen\Documents\Projects\hge181\lib\gcc\libhge.a C:\Users\Svalorzen\Documents\Projects\hge181\lib\gcc\libhelp.a 
Output size is 1.22 MB
Process terminated with status 0 (0 minutes, 3 seconds)
0 errors, 0 warnings

2番目の編集:ライブラリのコンパイルに使用するコマンドラインを追加します。

g++ -o buildscons\mingw\src\lib_json\json_reader.o -c -DWIN32 -DNDEBUG -D_MT -Iinclude src\lib_json\json_reader.cpp
g++ -o buildscons\mingw\src\lib_json\json_value.o -c -DWIN32 -DNDEBUG -D_MT -Iinclude src\lib_json\json_value.cpp
g++ -o buildscons\mingw\src\lib_json\json_writer.o -c -DWIN32 -DNDEBUG -D_MT -Iinclude src\lib_json\json_writer.cpp
ar rc buildscons\mingw\src\lib_json\libjson_mingw_libmt.a buildscons\mingw\src\lib_json\json_reader.o buildscons\mingw\src\lib_json\json_value.o buildscons\mingw\src\lib_json\json_writer.o
ranlib buildscons\mingw\src\lib_json\libjson_mingw_libmt.a
11
Svalorzen

私はついにCode :: BlocksにJsonCppのソースコードをインポートし、自分でライブラリを作成することでこれを修正しました。 Code :: Blocksが使用するのと同じコンパイラを使用していたため、Sconsで作成されたライブラリが機能しなかった理由については、まだ困惑していますが、同時に機能しませんでした(またはエラーが発生しなかったはずです)。 )。

0
Svalorzen

(私がしたように)グーグルからこれに来る人にとって、_Unwind_Resume__gxx_personality_v0への未定義の参照の本当の原因は、「dwarf2とは異なるスタック巻き戻し方法を使用するgccを使用する」[- 1 ]

私の場合、GCC 4.9でコンパイルされたコードを、GCC4.8以下でコンパイルされたライブラリにリンクしようとしていました。解決策は、ビルドしているのと同じコンパイラでライブラリを再コンパイルすることです。

32
Riot