状況は単純ですが、奇妙です。 LinearAlgebra.oソース(LAPACKへのリンクが必要)を使わずにプログラムをコンパイルすると、C++の例外がキャッチされて処理されます。コンパイルユニットを含めずにライブラリ(-llapack -lblas
)にリンクしている場合は、例外がキャッチされて処理されます。しかし、いったんそれを取得すると(コードは正常に実行されます)、C++の例外は正しく処理されなくなり、Windowsクラッシュハンドラ「プログラムがHQに戻って応答しなくなりました」というナンセンスが発生します。MinGW:LAPACKとBLASをリンクすると、C++例外が処理されなくなる
Hereこのソースファイル内で何が起こっているのかを明らかにしました。私はそれをとてもシンプルに保っていましたが、それが本当にコーシャーなのかどうかはわかりません。
私はC++例外が動作を停止させる原因となるFORTRANルーチンを呼び出すと思っています。しかし、私はこれを修正する方法を知りません。
UPDATE:
私はこの問題の一時的な回避策を発見したことは非常にうれしく思います:私は、直接私が現在使用しているLAPACKとBLASのルーチンをコンパイルするのMinGWのgfortran
コンパイラを使用しています。
-lgfortran
とg++
を使用してこれらのオブジェクトファイルをC++プロジェクトにリンクすると、問題は完全に処理され、例外は正しく処理されます。ボーナスとして、これは私がLAPACKルーチンを使用することを含めることができるので、今は〜4MBのライブラリをリンクする必要はありません。
編集:ライブラリを静的にリンクすると、「必要なものを取得する」だけなので、4MBの場合は問題になりません。
通常、Fortranコードは 'gfortran'フロントエンドを使ってコンパイルする必要があります。これは 'gcc'を使用し、言語自動検出機能が使用しない適切なフラグをコンパイラに追加します。コンパイルコンパイルで使用された引数を詳細オプション '-v'で確認することができます。 – rodrigo