2012-12-11 13 views
5

Stworzyłem DLL w MATLAB, który zapewnia mi interfejs do moich funkcji .m.Utworzyć DLL z MATLAB

Teraz chciałbym go użyć z biblioteką wykonawczą MCR. (MCR = Matlab Compiler Runtime).

Wywołuję tę bibliotekę DLL z poziomu procedury C, która ostatecznie zostanie skompilowana przy użyciu GCC (MinGW) w opakowującej bibliotece DLL.

Teraz moja funkcja zostanie oddany do dwóch formach:

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); 

z tych wybiorę ten drugi jako były na wydaje się być rodzajem „starym stylu/Legacy”.

nazywam to w ten sposób:

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

I tu problem zaczyna: mxDestroyArray() nie można znaleźć w trakcie łączenia:

undefined reference to `mxDestroyArray' 

Gdybym ręcznie dodać -llibmx do procesu budowania , przebiegi kompilacji, ale nie można znaleźć libmx.dll, ponieważ MCR umieszcza tylko $MCR\runtime\win32 na ścieżce, ale nie $MCR\bin\win32 gdzie libmx.dll żyć.

Co mogę zrobić?

Czy muszę wybrać inną funkcję "niszczenia", gdy używam samodzielnie skompilowanej biblioteki DLL?

Czy muszę się wygłupiać ze ścieżką? (Nie mam nadzieję ...)

Poza tym, istnieją inne funkcje, które są brakuje, ale myślę, że to będzie rozwiązane w ten sam sposób:

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

Nie jestem pewien, czy to jest rozwiązanie, ale ostatnie wersje Matlab pozwalają na dodawanie plików do projektu (przed kompilacją), które nie są automatycznie połączone. –

Odpowiedz

0

I okazało się, że to sprawia, duża różnica, jeśli używany jest MCR lub zainstalowana instalacja MATLAB.

  1. Zastosowanie -lmclmcrrt zamiast -lmx i używać poprawnej ścieżki biblioteki linker.
  2. Użyj poprawnych plików #include w każdym pliku używanym w kompilacji. W szczególności nie mieszaj razem #include "matrix.h" i pliku nagłówkowego utworzonego razem z biblioteką DLL MATLAB.
Powiązane problemy