5

外部 C ライブラリ (DLL) を matlab から呼び出すと、matlab は最初filename_thunk_pcwinXX.dllに temp ディレクトリに (XX は OS によって 32 または 64 のいずれかになります) という名前のサンク ファイルを生成しようとするようです。

matlab ドキュメントでは、このファイルは外部 DLL と Matlab の間のインターフェイスであると述べられているため、元の外部 DLL の他のデータは含まれていません。

問題は、実行時に他のライブラリを呼び出す可能性のあるライブラリを作成したことです。ライブラリが特定のライブラリを呼び出すと、matlab は常に奇妙な結果をもたらすか、クラッシュすることさえあります (すべてではありません。私のライブラリとここの他のライブラリは 64 ビットです)。 DLL)。

また、matlab の代わりに他の C/C++ プログラムから呼び出された場合、すべてのライブラリ関数は問題なく動作します。

matlab を適切に動作させるために、実行時にライブラリによって呼び出されるこれらの他のライブラリも、何らかのサンク ファイルを取得する必要があるのでしょうか。信じられませんが、matlabが外部ライブラリを処理する正確な方法もわかりません。

4

1 に答える 1

0

私は最近、同じ質問を掘り下げなければなりませんでした。完全な技術的詳細はリンクにありますが、簡単な答えは次のとおりです。

サンク DLL は、呼び出し規約の調整に関するものです。

サンク関数 boolint32int32doubleThunk は、Matlab の呼び出し規則で引数を受け取ります。すべての引数は、スタック上で連続して渡され、型指定されず、sizeof(size_t) (x64 では 64 バイト) 境界に整列されます。また、実際の DLL エクスポートへの関数ポインターを受け取り、引数をローカルの型付き変数にコピーした後、ネイティブの呼び出し規則でこの関数を呼び出します。

于 2016-07-15T17:01:25.183 に答える