2012-12-11 124 views
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 
+0

不確定這是否是解決方案,但最新版本的Matlab允許您將文件添加到未自動鏈接的項目中(編譯之前)。 –

回答

0

我發現它使如果使用MCR或已安裝MATLAB安裝,則會有很大差異。

  1. 使用-lmclmcrrt而不是-lmx併爲鏈接器使用正確的庫路徑。
  2. 在編譯中使用的每個文件中使用正確的#include文件。特別是,不要混合使用#include "matrix.h"和與MATLAB DLL一起創建的頭文件。