3

任何人都可以给我一些解决这个问题的提示吗?

我正在尝试编译“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”

环境变量:

我尝试从 matlab 终端使用以下命令将库添加到环境变量中。没有效果。

setenv('DYLD_LIBRARY_PATH', [getenv('DYLD_LIBRARY_PATH') ':/usr/lib/']);

在 bash 中:

只需按照此处的建议调用 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++,然后像(1)中那样运行 gcc,则会出现与以前相同的错误。(找不到库)。为什么 gcc 可以找到该库,但是当 matlab 在(1)中添加内容时,它会搞砸?

因此,与上述内容相关,我开始从(1)中删除所有参数,直到出现不同的错误。我删除了-Wl,-syslibroot,这意味着 -syslibroot 将不再被传递给ld,这似乎已经修复了它。-syslibroot弄乱图书馆搜索目录也是如此!现在想办法从mex()调用中删除这个参数。

4

3 回答 3

2

您是否尝试添加OpenNi到您的LIBRARY_PATH?

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

于 2011-11-25T05:11:00.650 回答
1

第一种选择:如果 libOpenNi 与您正在编译的二进制文件的架构不同,则整个编译器套件可能会忽略它。如果您确实设法让它链接,它可能会崩溃。找到一个本地 64 位库并链接到它。

第二种选择:我对此不是 100% 确定的,但是每当我尝试在一些深奥的 linux 项目上进行链接时,我都会从 .a 指定路径中的对象存档开始-L。如果它链接,那么我将添加-fPIC -sharedx86_64 以使其针对共享库进行编译。我不确定这是否适用于 OSX:我还没有在那个平台上进行过开发。

于 2011-11-22T07:44:26.733 回答
0

繁荣!有用!

好的,这里是:

-Wl,-syslibrootgcc 调用(1)中的选项正在向链接器发送一个-syslibroot选项,并且以某种方式将其添加到库搜索路径中(即使它不应该根据无法在链接时使用 syslibroot 指定 root sdk 目录

因此,删除它-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);
于 2011-11-28T10:48:06.263 回答