Создайте DLL из MATLAB

Я создал 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

person glglgl    schedule 11.12.2012    source источник
comment
Не уверен, что это решение, но последние версии Matlab позволяют добавлять в проект файлы (перед компиляцией), которые не связаны автоматически.   -  person Dennis Jaheruddin    schedule 14.01.2013


Ответы (1)


Я обнаружил, что это имеет большое значение, если используется MCR или установленная установка MATLAB.

  1. Используйте -lmclmcrrt вместо -lmx и используйте правильный путь к библиотеке для компоновщика.
  2. Используйте правильные файлы #include в каждом файле, используемом в компиляции. Особенно не смешивайте #include "matrix.h" и заголовочный файл, созданный вместе с MATLAB DLL.
person glglgl    schedule 14.01.2013