7

MinGW で構築した静的ライブラリがあり、Qt アプリケーションからそのライブラリにリンクしようとしています。ライブラリ内のオブジェクト ファイルの 1 つが原因でリンカー エラーが発生し続けます。このファイルは、実際には 2 つの Boost ヘッダーを宣言しています。1 つは shared_ptr を使用するためのもので、もう 1 つはクラスをコピー不可にするためのものです。このブースト機能の使用が問題の原因であると考えていますが、その理由はわかりません。ファイルで定義されたクラスを使用する Qt アプリのクラスをコメントアウトすると、Qt アプリは正常にリンクします。これは、出力のエラー部分です。

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text+0x10a): `__gxx_personality_sj0' への未定義の参照

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text+0x12f): `_Unwind_SjLj_Register' への未定義の参照

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text+0x203): `_Unwind_SjLj_Resume' への未定義の参照

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text+0x20e): `_Unwind_SjLj_Unregister' への未定義の参照

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text+0x226): `__gxx_personality_sj0' への未定義の参照

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text+0x24b): `_Unwind_SjLj_Register' への未定義の参照

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text+0x31f): `_Unwind_SjLj_Resume' への未定義の参照

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text+0x32a): `_Unwind_SjLj_Unregister' への未定義の参照

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text$_ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_[boost::detail::shared_count::shared_count(foo::foo_SomeClassImpl*)] +0xc): `__gxx_personality_sj0' への未定義の参照

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text$_ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_[boost::detail::shared_count::shared_count(foo::foo_SomeClassImpl*)] +0x31): `_Unwind_SjLj_Register' への未定義の参照

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text$_ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_[boost::detail::shared_count::shared_count(foo::foo_SomeClassImpl*)] +0xfb): `_Unwind_SjLj_Resume' への未定義の参照

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text$_ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_[boost::detail::shared_count::shared_count(foo::foo_SomeClassImpl*)] +0x106): `_Unwind_SjLj_Unregister' collect2 への未定義の参照: ld は 1 つの終了ステータスを返しました

言及すべきもう 1 つのことは、このクラスの実装へのポインターを使用していることです。どんな助けでも大歓迎です。

解決済み: MinGW が GCC バージョンを提供する前に、古いバージョンの GCC がパスに含まれていることがわかりました。古いバージョンは、しばらく前に持っていた GNUStep パッケージに含まれていました。これらの異なるバージョンの構成が問題を引き起こしていると思います。問題を解決するために正しい軌道に乗っていた kemiisto に感謝します。

4

3 に答える 3

3

スタティック ライブラリは 1 つの MinGW ディストリビューション (つまり、3 番目のバージョン) に対してリンクされていたようですが、他の MinGW ディストリビューション (つまり、バイナリ Qt で配布されている 4 番目のバージョン) を使用してアプリケーションをこのライブラリにリンクしようとしています。アプリケーション開発に使用するのと同じ MinGW を使用して、ライブラリを再構築する必要があります。

アップデート

それは別のよく知られた問題かもしれません。このトピックを見てください。おそらく、Qt ライブラリを含む 2 つの異なるフォルダーがあるでしょう。

C:\Qt\2009.05\bin;C:\Qt\2009.05\qt\bin 

あなたの道にも。VS2008 でコンパイルされた最初のフォルダー (...\bin) のライブラリと、MinGW でコンパイルされた 2 番目のフォルダー (...\qt\bin) のライブラリ。パス変数の項目は、アプリケーションの起動時に検索されます。突然、「間違った」ライブラリを含むフォルダーが、パス変数に正しいアイテムを含むフォルダーの前に存在します。できることは、QtCore4.dll、QtGui4.dll、および必要なその他のライブラリを、アプリケーションの実行可能ファイルと共にフォルダーにコピーすることです。お役に立てれば。

この問題に関するいくつかのリンク:

于 2010-02-03T11:36:16.217 に答える
2

他の誰かがこの問題を抱えている場合に備えて、私のプロジェクトの再構築では.o、以前のビルドのファイルを使用していました。その間にコンパイラを変更しました。

.o同じプロジェクトを再構築したときに、新しいコンパイラが新しいファイルを構築しなかったため、いくつかの重要な情報が欠落していたことがわかりました。古いファイルを削除して再構築した後、エラーが修正されました。

削除せずに最初から再構築しても同じように機能すると思います。

于 2012-11-08T05:54:06.113 に答える
0

gccの代わりに使用した可能性がありますg++。gcc は C コンパイラです。g++ は c++ コンパイラです。

.cpp ファイルがある場合は、必ず g++ を使用してください。

于 2014-08-09T23:02:40.550 に答える