我在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
答案 0 :(得分:0)
我发现如果使用MCR或安装了MATLAB,它会产生很大的不同。
-lmclmcrrt
代替-lmx
,并为链接器使用正确的库路径。#include
个文件。特别是,不要混合#include "matrix.h"
和与MATLAB DLL一起创建的头文件。