Я создал DLL в MATLAB, которая предоставляет мне интерфейс для моих функций .m.
Теперь я хотел бы использовать его с библиотекой времени выполнения MCR. (MCR = среда выполнения компилятора Matlab).
Я вызываю эту DLL из подпрограммы C, которая в конечном итоге компилируется с помощью 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