2

状況は単純ですが、奇妙です。LinearAlgebra.oソース(LAPACKへのリンクが必要)なしでプログラムをコンパイルすると、C++例外がキャッチされて処理されます。そのコンパイルユニットを含めずにライブラリ(-llapack -lblas)にリンクすると、例外がキャッチされて処理されます。しかし、そこに入ると(コードは正常に実行されます)、C ++例外は正しく処理されなくなり、Windowsクラッシュハンドラー「プログラムが本社へのレポートの応答を停止しました」というナンセンスが発生します。

ここで、このソースファイル内で何が起こっているのかを明らかにします。私はそれをかなり単純に保ちました、しかしそれが本当にコーシャであるかどうかはわかりません。

これは、C++例外が機能しなくなる原因となるFORTRANルーチンの呼び出しに関するものだと思います。しかし、私はこれを修正する方法がわかりません。

アップデート:

この問題の一時的な回避策を見つけて非常にうれしく思います。MinGWのgfortranコンパイラを使用して、現在使用しているLAPACKおよびBLASルーチンを直接コンパイルしています。

-lgfortranを使用してこれらのオブジェクトファイルをC++プロジェクトにリンクするg++と、問題なく動作しますが、例外は引き続き正しく処理されます。ボーナスとして、これにより、使用する予定のLAPACKルーチンのみを含めることができるため、最大4MBのライブラリをリンクする必要がなくなりました。

編集:私がライブラリを静的にリンクする場合、それは「必要なものをつかむ」だけなので、その場合は4MBであっても問題ないと思います。

4

1 に答える 1

0

GotoBLAS2 ですばらしい結果が得られました。含まれているスクリプトを実行すると、私のマシン用に最適化された 19MB の大規模な静的ライブラリが生成されます。リンクするだけで問題なく動作します。私の fortran スタイルの呼び出しはすべて機能します。

于 2011-12-30T00:46:04.120 に答える