Кто-нибудь может дать мне несколько советов для решения этой проблемы?
Я пытаюсь скомпилировать "Kinect Matlab" (в Mac OS 10.7), в скрипте компиляции есть следующая строка:
mex('-v','-L/usr/lib/','-lOpenNI',[...],Filename);
Это полная команда, запущенная mex: (1)
gcc-4.2 -O -Wl,-twolevel_namespace -undefined error -arch x86_64 -Wl,-syslibroot,/Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.5 -bundle -Wl,-exported_symbols_list,/Applications/MATLAB_R2011a.app/extern/lib/maci64/mexFunction.map -o "mxNiChangeDepthViewPoint.mexmaci64" mxNiChangeDepthViewPoint.o -L/usr/lib/ -lOpenNI -L/Applications/MATLAB_R2011a.app/bin/maci64 -lmx -lmex -lmat -lstdc++
Тогда я получаю следующую ошибку:
ld: library not found for -lOpenNI
collect2: ld returned 1 exit status
mex: link of ' "mxNiChangeDepthViewPoint.mexmaci64"' failed.
Наиболее определенно существует файл в /usr/lib/libOpenNI.dylib
.
Какие вещи заставляют ld
выдавать эту ошибку?
Что я пробовал:
- Я попытался создать символическую ссылку с именем
libOpenNI.so
, как предложил jmlopez, без эффекта.
- Может ли быть так, что
libOpenNI
является 32-битной библиотекой, и ld
не видит ее по этой причине? Или тогда ошибка будет другой?
- Относительно пункта выше, он говорит, что сборка "универсальная x86 / x64"
Env vars:
Я попытался добавить библиотеку в переменные окружения с помощью следующей команды из терминала matlab. Нет эффекта.
setenv('DYLD_LIBRARY_PATH', [getenv('DYLD_LIBRARY_PATH') ':/usr/lib/']);
В Баш:
Просто вызов gcc, как предлагается здесь https://serverfault.com/questions/54736/how-to-check-if-a-library-is-installed не доставляет проблем.
$ gcc -lOpenNi
Undefined symbols for architecture x86_64:
"_main", referenced from:
start in crt1.10.6.o
Однако, если я сначала запускаю g ++, то gcc, как в (1) , та же ошибка, что и раньше. (библиотека не найдена). Почему gcc может найти библиотеку, но когда matlab добавляет вещи в (1) , они все портят?
Итак, в связи с тем, что сказано выше, я начал удалять все аргументы из (1) , пока не получил другую ошибку. Я удалил -Wl,-syslibroot
, что означает, что -syslibroot больше не будет передаваться ld
, это, похоже, исправило его. Так что -syslibroot
портит каталог поиска библиотеки! Теперь, чтобы найти способ удалить этот аргумент из вызова mex()
.