2

MatlabからC共有ライブラリをコンパイルしようとしています。私のMatlabコードは、多くの画像処理機能を使用しています。したがって、コンパイルは正常に行われますが、アプリケーションからdllを呼び出すと、次のようなメッセージが表示されます。

「double型の入力引数の未定義の関数またはメソッド'XYZ'」。

私は自分の引数が大丈夫であることを確認しました-それは型の問題ではありません。そこで、.mファイルに追加しようとし%#function XYZましたが、何の役にも立ちませんでした。次に、-aコンパイルコマンドでフラグを使用してみました。

eval(['mcc -v -N -W lib:cshared -d ' clibdir ' -T link:lib -a edge' allFiles]); 

しかし、それはコンパイルに失敗します:

Depfunエラー:'MATLABパス上の関数としてエッジを見つけることができません'

画像処理ファイルがコンピューター上にあり(matlabからすべてを問題なく実行できます)、パスがそれらを含むディレクトリを指していることを確認しました。

また、toolbox .mファイルを作業ディレクトリにコピーしようとしましたが、すぐに多くのファイルに膨れ上がります。また、一部の関数では、.mはなく(.mexのみ)、.dllにmexファイルを含める方法が見つかりませんでした。

私は何が欠けていますか?

4

1 に答える 1

3

オプションを使用してImageProcessingToolboxフォルダーを含めてみました-aか?例えば:

mcc ... -a C:\Program Files\MATLAB\R2009a\toolbox\images\images

mccドキュメントによると、このフォルダー内のすべてのファイルとサブフォルダー内のすべてのファイルがCTFアーカイブに追加され、フォルダーサブツリーはCTFアーカイブに保存されます。

すべてのサブフォルダーを含めたくない場合は、ワイルドカードパターンを使用してフォルダー内のファイルのみをロードできます。

mcc ... -a C:\Program Files\MATLAB\R2009a\toolbox\images\images\*

これは、親フォルダー内のサブフォルダーをシャドウする可能性のある関数またはスクリプトを持つサブフォルダーがある場合に必要になることがあります。たとえばedge.m、親フォルダーに関数があり、日本語のヘルプファイル(Windowsの場合)を含むサブフォルダーC:\Program Files\MATLAB\R2009a\toolbox\images\images\があり、そのうちの1つは。とも呼ばれます。コンパイル時にこのサブフォルダーを追加したくないので、次のいずれかを実行できます。jaedge.m

  1. そのサブフォルダーを一時的に削除し、ワイルドカードオプションを指定せずに親フォルダーを追加して(必要な他のサブフォルダーを追加するため)、そのフォルダーを元に戻します。

  2. @strelワイルドカードオプションを使用して親フォルダーを追加し(ファイルのみを追加する場合)、追加のコマンドを使用して、必要なサブフォルダー(およびなどprivate)のみを個別に追加します-a注:サブフォルダーを個別に追加しても、オプション#1と同じように、親ディレクトリのフォルダーサブツリーがCTFアーカイブに保持されるかどうかはわかりません。

最終的に使用されない可能性のあるファイルの大きなリストを含めたくない場合は、代わりに関数DEPFUNを使用して、MATLABコードの依存関係のリストを最初に取得してみてください。次に、このリストから、コードが使用する特定のImage Processing Toolbox関数を見つけ、コンパイル時にそれらのみを含めることができます。あなたが具体的に尋ねたので、このニュースグループのスレッドは.mexファイルを含める方法について言及しています:

mcc ... -a imreconstructmex.mexw32  %# For a 32-bit Windows mex file


注: R2009bのWindowsでいくつかのImage Processing Toolbox関数を使用してアプリケーションをコンパイルする際の問題について言及しているMathWorksバグレポート(表示するにはログインが必要です)もあります。上記のリンクにある回避策があります。このバグはR2010aで修正されています。

于 2010-09-27T14:56:46.377 に答える