Mex не может правильно связать, в результате чего "dyld: ленивая привязка символа не удалась: символ не найден: _mxGetNumberOfDimensions_700"
Я пытался перекомпилировать какой-то старый код, который у меня был на моей новой машине, но он постоянно терпел неудачу. Я сократил проблему до более или менее минимального примера.
Код:
#include <math.h>
#include <mat.h>
#include <matrix.h>
int main(int argc, char *argv[]) {
const char *name;
int ndim;
MATFile *pmat;
mxArray *pa;
pmat = matOpen("../orders/order_fractal_C1.mat", "r");
pa = matGetNextVariable(pmat, &name);
ndim = mxGetNumberOfDimensions(pa);
return 0;
}
Скомпилировано с командой
$MATLABROOT/bin/mex -v -f ~/matopts.sh CFLAGS="" -output test test.c
Файл matopts.sh указывает на то, что я использую gcc-5 (устанавливается через homebrew).
Код компилируется без ошибок или предупреждений, но при выполнении./test я получаю
dyld: ленивая привязка символов завершилась неудачно: символ не найден: >_mxGetNumberOfDimensions_700 Ссылка на: /Users/keith/Dropbox/Code/sphere/newparallel/C/./test Ожидается в: /usr/lib/libSystem.B.dylib
dyld: символ не найден: _mxGetNumberOfDimensions_700 Ссылка на: /Users/keith/Dropbox/Code/sphere/newparallel/C/./test Ожидается в: /usr/lib/libSystem.B.dylib
Если я не включу последнюю строку кода, все хорошо. Что не так? Почему он "ожидает", что символ будет в libSystem.B.dylib, а не в matrix.h?
РЕДАКТИРОВАТЬ: Весь файл matopts.sh довольно большой, все, что я сделал, это изменить
CC='gcc'
в
CC='gcc-5'
в двух случаях, поэтому он не будет использовать лязг.
РЕДАКТИРОВАТЬ 2: Я решил вернуться к использованию Clang, полагая, что, вероятно, лучше всего просто принять способ, которым Matlab хочет делать вещи.
Теперь я могу заставить его работать, но только при выполнении команды из Matlab, либо скомпилировав его как mexFunction
и вызывая функцию в Matlab, или скомпилировав ее с -client engine
а затем работает с !./test
,
Однако, если я пытаюсь запустить его из-за пределов Matlab, я получаю ту же ошибку, что и раньше.
1 ответ
Вам нужно добавить -largeArrayDims
(обратите внимание на случай) к вашему mex
команда.
Если у вас все еще есть проблемы, убедитесь, что вы не определяете MX_COMPAT_32
в любом месте.