5

.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
4

1 に答える 1

0

MCRを使用するか、MATLABインストールをインストールするかによって、大きな違いが生じることがわかりました。

  1. -lmclmcrrt代わりに-lmxを使用し、リンカーの正しいライブラリパスを使用してください。
  2. #includeコンパイルで使用されるすべてのファイルで正しいファイルを使用してください。特に、MATLABDLL#include "matrix.h"と一緒に作成されたヘッダーファイルを混在させないでください。
于 2013-01-14T13:09:30.533 に答える