5
我在MATLAB中創建了一個DLL,它爲我的.m函數提供了一個接口。從MATLAB創建一個DLL
現在我想與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
,其中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
不確定這是否是解決方案,但最新版本的Matlab允許您將文件添加到未自動鏈接的項目中(編譯之前)。 –