MATLAB (v7.0.4) コンパイラで生成された dll を呼び出すプロジェクトがあります。同じプロジェクトは、いくつかの MKL Intel Fortran 2011 ルーチンも呼び出します。最近の MKL ライブラリからいくつかの MKL ルーチンを直接使用している場合、MATLAB には独自の (この場合は古い) mkl ライブラリがあるため、初期化を試みる競合する mkl ライブラリがあると、プログラムは不平を言います。正確なメッセージは、「OMP 中止: libguide40.lib を初期化していますが、libiomp5md.dll が既に初期化されていることがわかりました」です。INTEL は、このケースを克服するために、環境変数 KMP_DUPLICATE_LIB_OK = TRUE を設定することは理想的とは言えない修正を提案しました。より適切な解決策を望みます。
当然、この問題は、Matlab でコンパイルされた dll が既に初期化されているが、まだ終了されていない (Initialize と Terminate を使用) 間に、プロジェクトが MKL ルーチンを呼び出した場合にのみ発生します。Matlab でコンパイルされた dll で Terminate を事前に呼び出すと、mkl ルーチンの呼び出しは正常に機能します。ただし、Matlab でコンパイルされた dll と MKL への呼び出しは絡み合っており、matlab でコンパイルされた dll はアプリケーションで Initialize と Terminate を複数回使用することを受け入れません。 MKL ルーチンを呼び出して、後で dll を再読み込みし、さらに matlab dll 呼び出しを行います。matlab でコンパイルされた dll のインターフェイス メソッド mclInitializeApplication と mclTerminateApplication を複数回使用すると、プログラムがクラッシュします。また、Initialize と Terminate を複数回使用すると、Initialize 呼び出しでプログラムが無期限にハングします。mclInhibitShutdown() を使用することはできません。これは、mkl ライブラリと競合することなく MKL ルーチンを呼び出すことができるようにする必要があるときに、dll を終了しないためです。
この競合する mkl ライブラリを回避するために、Matlab でコンパイルされた dll を同じアプリケーションで繰り返しアンロードおよびリロードする方法はありますか?? プロジェクトと Matlab でコンパイルされた dll の間に別の dll 'リンク' を追加しましたが、それでも解決しませんでした。したがって、私のプロジェクトは、Matlab でコンパイルされた dll を呼び出す「リンク」dll を呼び出します。Matlab でコンパイルされた dll を終了してから、「リンク」dll を解放しようとしましたが、何らかの理由で、Matlab でコンパイルされた dll をリロードできません。
これを処理する方法について何か提案はありますか? 私はこれに慣れていないので、私の説明はあまり正確ではないかもしれません。
ありがとう、サマー。