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 в любом месте.

Другие вопросы по тегам