компоновщик gcc не может найти библиотеку (openNI) - PullRequest
3 голосов
/ 15 ноября 2011

Кто-нибудь может дать мне несколько советов для решения этой проблемы?

Я пытаюсь скомпилировать "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().

Ответы [ 3 ]

2 голосов
/ 25 ноября 2011

Вы пытались добавить OpenNi к вашему LIBRARY_PATH?

export LIBRARY_PATH=$LIBRARY_PATH:/YOUR-PATH/OpenNi

1 голос
/ 22 ноября 2011

Первый вариант: если libOpenNi не имеет ту же архитектуру, что и бинарный файл, который вы компилируете, весь набор компиляторов, скорее всего, его проигнорирует. Если вам все-таки удастся заставить его соединиться, это может привести к сбою. Найдите собственную 64-битную библиотеку и создайте ссылку на нее.

Второй вариант: я не уверен на 100% в этом, но всякий раз, когда я пытался создать ссылку на некоторые эзотерические проекты Linux, я начинаю с архива объекта .a по пути, указанному -L. Если он ссылается, я добавлю -fPIC -shared на x86_64, чтобы он скомпилировался с общей библиотекой. Я не уверен, будет ли это работать на OSX: я еще никогда не занимался разработкой для этой платформы.

0 голосов
/ 28 ноября 2011

БУМ!ОНО РАБОТАЕТ!

Хорошо, вот оно:

Опция -Wl,-syslibroot в вызове gcc (1) отправляет компоновщику опцию -syslibroot,и каким-то образом это добавляется к пути поиска в библиотеке (хотя в соответствии с не следует указывать корневой каталог sdk с syslibroot при связывании )

Таким образом, удаление этого -syslibroot может решитьнаша проблема, это может быть сделано в mexopts.sh.Копирование версии Matlab из местоположения по умолчанию:

cp /Applications/MATLAB_R2011a.app/bin/mexopts.sh ~/.matlab/R2011a/

И затем изменение этой строки (201):

LDFLAGS="-Wl,-twolevel_namespace -undefined error -arch $ARCHS -Wl,-syslibroot,$SDKROOT -mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET"

Удаление аргумента -Wl,-syslibroot,$SDKROOT.

Дополнительно,Я мог бы удалить аргумент -L/usr/lib из вызова mex, сделав его просто:

 mex('-v','-lOpenNI',['-I' OpenNiPathInclude],Filename);
...