.m関数へのインターフェイスを提供するDLLをMATLABで作成しました。
それでは、MCRランタイムライブラリで使用したいと思います。(MCR = Matlabコンパイラランタイム)。
私はこのDLLをCルーチン内から呼び出しており、最終的にはGCC(MinGW)でラッパーDLLにコンパイルされます。
これで、私の関数は2つの形式になります。
extern LIB_XYZ_C_API
bool MW_CALL_CONV mlxGet_path(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]);
extern LIB_XYZ_C_API bool MW_CALL_CONV mlfGet_path(int nargout, mxArray** p);
これらの中から後者を選びます。前者は一種の「オールドスタイル/レガシー」のようです。
私はそれをこのように呼びます:
char get_path(LStrHandle path)
{
char mret = init_XYZ(); // here I call mclmcrInitialize(), mclInitializeApplication(NULL, 0) etc.
if (mret) return mret;
mret = 2;
// here the relevant part begins
mxArray * mxpath = NULL; // set it to NULL and let the callee allocate it
bool bret = mlfGet_path(1, &mxpath);
// now I convert the mxpath to a string
// What do I do with the mxpath afterwards?
// I try to free it with
mxDestroyArray(mxpath);
return mret;
}
そして、ここで問題が始まります:mxDestroyArray()
リンクプロセスで見つかりません:
undefined reference to `mxDestroyArray'
ビルドプロセスに手動で追加-llibmx
すると、ビルドは実行libmx.dll
されますが、MCR$MCR\runtime\win32
はパスにのみ配置され、存在する$MCR\bin\win32
場所には配置されないため、見つかりませんlibmx.dll
。
私に何ができる?
自己コンパイルされたDLLを使用する場合、別の「破棄」関数を選択する必要がありますか?
それとも私は道をいじくり回す必要がありますか?(私はそうは思わない...)
その上、欠けている他の機能がありますが、これは同じ方法で解決されると思います:
mxGetNumberOfElements
mxIsDouble
mxGetPr
mxGetM
mxGetN
mxGetData
mxIsChar
mxIsCell
mxDestroyArray
mxGetCell_730
mxSetCell_730
mxGetString_730
mxCalcSingleSubscript_730
mxGetNumberOfDimensions_730
mxCreateDoubleMatrix_730
mxCreateNumericMatrix_730
mxCreateCellMatrix_730