1

一部のハードウェアと通信する外部C++ライブラリとMATLABをインターフェイスするmexファイルを作成しようとしています。インポートされたライブラリとプリコンパイルされたDLL(.libおよび.dll)は、私のバージョンのVC ++用にハードウェアベンダーから提供されており、問題なくC++で実装できました。

ただし、コードがmex(同じバージョンのVC ++でコンパイルされたもの)として記述されている場合、実行時にセグメンテーションエラーが発生しました。VC ++デバッガーで調査した結果、外部dll関数の1つがデータ型std :: vectorを返し、関数内のどこかにベクターコンテナーにメモリを動的に割り当てようとしていることが原因である可能性があります。自分のmex関数でstd::vectorを使用すると、すべてが正常に機能することはわかっていますが、すべての動的に必要なメモリ管理(?)のために、mexヘッダー自体がstd::vectorコンテナーを自分のコードでラップしていると思われます。 mexコードでメモリを割り当てましたが、プリコンパイルされた.dllでは同じことはできません。

ここで問題は、外部.dllファイルを変更できず、そのソースファイルにアクセスできないため、ダイナミックメモリがMATLAB(おそらく何らかのラッパー)によって管理されるように、この外部dllを操作する方法はありますか。 。?)...そしてそれによってセグメンテーションエラーを回避し、正しいデータを返しますか?または、私の分析が間違っている場合は、私も訂正してください!

アイデアやハックがあれば教えてください、ありがとう!

私のシステム:Windows 7 SP1 32ビット、MATLAB 2009b、Visual C ++2008Pro。

同じ質問を次の場所にも投稿しました:http: //www.mathworks.com/matlabcentral/answers/9294-mex-dynamic-memory-management-issue-with-std-vector-in-linked-external-dll-segmentation-エラー 。アカウントをお持ちの場合は、そこで洞察を共有することもできます。ありがとうございます。

4

2 に答える 2

2

回答とコメントをありがとうございました。MathWorksのフレンドリーな人々の助けを借りて、問題を解決することができました。

http://www.mathworks.com/matlabcentral/answers/9294-mex-dynamic-memory-management-issue-with-std-vector-in-linked-external-dll-segmentation-errorの元の投稿から:

おそらく、プリコンパイルされたdllで使用されるstlライブラリやコンパイラオプションと、MATLABおよびMEXコマンドで使用されるオプションとの間に互換性がないことがわかります。MATLAB 2009bは、MSVC2005で構築されました。

mexで使用されるオプションを変更するか、MSVCを使用してmexファイルを直接作成することで、問題を解決できる場合があります。物事に影響を与える可能性のあるオプションの一例は、SECURE_SCL=0です。まず、MATLABが問題のあるオプションを見つけるために使用しているオプションを使用してテストプログラムをビルドし、mexファイルをビルドするときにそのオプションを削除してみます。

この種の非互換性のため、サードパーティのコンパイル済みライブラリのAPIでstlオブジェクトを使用することは通常悪い考えです。

彼のアドバイスに従って、私はSECURE_SCL=0オプションをmexオプションファイルから削除しました。

C:\ Users \(ユーザー名)\ AppData \ Roaming \ MathWorks \ MATLAB \ R2009b \ mexopts.bat

次に、mexファイルを再コンパイルすると、すべてがチャームのように機能します。関数は正しいデータを返し、セグメンテーションエラーは発生しなくなりました。

于 2011-06-13T20:59:50.323 に答える
1

MEX APIは、MATLABとMEX関数(それを実行できる唯一の非プリミティブデータ型はmxArray)の間で受け渡すことができないため、STLコンテナーに対して特別なことは何もしません。STLコンテナによって使用されるメモリが適切に処理されることを確認するのは基本的にMEX関数次第です。MATLABはそれを追跡しません。

DLLの境界を越えてstd::vectorを渡すのはやや注意が必要です。ベンダーはこれを認識しており、正しいdeclspecsなどを含む適切なヘッダーファイルを提供すると思いますが、そうでない場合は、このMicrosoftサポートリンクを参照して、詳細を確認することをお勧めします。必要とされている。

于 2011-06-12T14:39:21.453 に答える