有人能给我一些解决这个问题的提示吗?
我正在尝试编译"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
因为这个原因没有看到它吗?或者错误会不同?我尝试使用matlab终端中的以下命令将库添加到环境变量中。没效果。
setenv('DYLD_LIBRARY_PATH', [getenv('DYLD_LIBRARY_PATH') ':/usr/lib/']);
按照https://serverfault.com/questions/54736/how-to-check-if-a-library-is-installed的建议调用gcc不会产生任何问题。
$ 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()
调用中删除此参数的方法。
答案 0 :(得分:2)
您是否尝试将OpenNi
添加到LIBRARY_PATH
?
export LIBRARY_PATH=$LIBRARY_PATH:/YOUR-PATH/OpenNi
答案 1 :(得分:1)
第一个选项:如果libOpenNi与您正在编译的二进制文件的架构不同,整个编译器套件可能会忽略它。如果你确实设法让它连接,它可能会崩溃。找到一个本机64位库并链接到它。
第二个选项:我对此并不是100%肯定,但每当我尝试在某些深奥的Linux项目上进行链接时,我都会在-L
指定的路径中使用.a对象存档。如果它链接,那么我将在x86_64上添加-fPIC -shared
以使其针对共享库进行编译。我不确定这是否适用于OSX:我从未在该平台上进行过开发。
答案 2 :(得分:0)
好的,这是:
gcc调用中的-Wl,-syslibroot
选项(1)正在向链接器发送-syslibroot
选项,并以某种方式将其添加到库搜索路径中(即使它不应该根据cannot specify root sdk directory with syslibroot when linking)
因此,删除此-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
参数。
此外,我可以从调用mex中删除-L/usr/lib
参数,简单地说:
mex('-v','-lOpenNI',['-I' OpenNiPathInclude],Filename);