从MATLAB创建一个DLL

时间:2012-12-11 09:19:30

标签: matlab linker matlab-deployment matlab-compiler

我在MATLAB中创建了一个DLL,它为我的.m函数提供了一个接口。

现在我想将它与MCR运行时库一起使用。 (MCR = Matlab编译器运行时)。

我在C例程中调用此DLL,最终使用GCC(MinGW)编译成包装DLL。

现在我的函数分为两种形式:

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 1}} 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

1 个答案:

答案 0 :(得分:0)

我发现如果使用MCR或安装了MATLAB,它会产生很大的不同。

  1. 使用-lmclmcrrt代替-lmx,并为链接器使用正确的库路径。
  2. 在编译中使用的每个文件中使用正确的#include个文件。特别是,不要混合#include "matrix.h"和与MATLAB DLL一起创建的头文件。