web-dev-qa-db-ja.com

プロシージャのエントリポイント__gxx_personality_sj0が見つかりませんでした...

私は(どういうわけか)Qt5を32ビットWindows用のMingw-w64プロジェクトのコンパイラとクロスコンパイルすることに成功しました。すべてのライブラリは~/i686-w64-mingw32にインストールされています。

クロスコンパイルしようとしているCMakeベースのQtプロジェクトがあります。 これらの手順 に従うことで、プロジェクトをコンパイルすることができました。ここまでは順調ですね。

残念ながら、結果のバイナリをWindowsで実行すると、エラーが発生します。

プロシージャエントリポイント__gxx_personality_sj0がダイナミックリンクライブラリ[application_name] .exeに見つかりませんでした。」

* [application_name]はメインの実行可能ファイルへのフルパスです

この種の問題は、異なるバージョンのMinGWでコンパイルされたライブラリを混合することによって引き起こされることがあると聞きました。ただし、このマシン上のすべて(すべてのライブラリと実行可能ファイル)は、すべて同じコンパイラ(i686-w64-mingw32ツールチェーン)によってコンパイルされています。

また、.dllファイルの1つではなく、アプリケーションの実行可能ファイルにエントリポイントがないというエラーが表示されるのは奇妙だと思います。

このエラーの原因と、それを修正するために何ができるでしょうか。

17
Nathan Osman

結局、問題はlibstdc++-6.dllのどこかでわがままな$PATHが原因であることが判明しました。 Mingw-w64によって作成されたコピーがアプリケーションのディレクトリにあることを確認した後、すべてが機能しました。

11
Nathan Osman

間違ったライブラリの場所を見つける:

  • コマンドプロンプトを開きます。
  • 「libstdc ++-6.dll」と入力して「Enter」キーを押します
  • パスとメッセージを含むメッセージボックスが表示されます:c:/ somefolder/someapp /.../ libstdc ++-6.dllこのファイルにはプログラムが関連付けられていません...などパスが答えです。 ==
  • IDE内からアプリを実行する:IDEの%PATH%は、コマンドプロンプトの%PATH%とは異なる場合があります(IDE設定を参照)。この場合、「libstdc ++-6.dll」をバッチファイルに入れ、IDE内からバッチを実行すると、プログラムが取得しているライブラリの特定のインスタンスが表示されます。

私の個人的な解決策:

  • 「システムプロパティ」->「環境変数」(私の場合はWindows 7)を開き、両方の%PATH%変数(アカウント用のものとシステム全体の変数%PATH%)がc:\ mingwで始まることを確認します。\bin(またはライブラリへのパス)。また、新しいPATHを取得するには、IDEを再起動する必要がある場合があります。

私の経験では、%PATH%内の場所を選択するMSWindowsの方法は非常に不安定な場合があります。前回、1つの関数を含む1つのソースファイルを追加し、その関数をコードに含めました。関数のコードをすべて削除し、「return」ステートメントだけを残した場合でも、プログラムは常に間違ったlibstdc ++-6.dllを選択していました。その関数がコメントアウト(除外)されるたびに、プログラムは再び正常に実行されます。 Windowsが「システム変数」からPATHを選択し、何らかの理由で「ユーザー変数」PATH(WindowsアカウントのPATH)を回避することがあると思います。

15
cloudcell