gcc链接器找不到库(openNI)

时间:2011-11-15 17:03:02

标签: matlab compilation ld mex openni

有人能给我一些解决这个问题的提示吗?

我正在尝试编译"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/']);

在bash中:

按照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()调用中删除此参数的方法。

3 个答案:

答案 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)

BOOM!它工作!

好的,这是:

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);