2013-11-04 106 views
5

我很感兴趣,我的系统具有以下规格上使用Kota Yamaguchi's mexopencv library编译mexopencv在OS X 10.9和Xcode 5和Matlab R2013b

  • OS X 10.9(小牛)
  • 的Xcode 5
  • 通过安装MacPorts的MATLAB 2013b
  • 的OpenCV到/ opt /本地/包括/ {OpenCV的,opencv2}和/ opt/local/lib目录

我的git使用mexopencv网站上的命令克隆最新的OpenCV修订版;这是从08年7月20日05:18:37 2013-0700版本084838d62a25fcb3eec9f610abf91b167bc6c2f5。

我运行了Matlab的mex -setup命令,然后从Mathworks实现了this workaround,使用Xcode 5作为我的mex编译器。

我的MacPorts添加的pkg-config命令与Matlab的命令的路径现在setenv('PATH', [getenv('PATH') ':/opt/local/bin']);

,运行mxopencv.make产生下面的链接器错误消息:

Undefined symbols for architecture x86_64: 
    "cv::merge(std::vector<cv::Mat, std::allocator<cv::Mat> > const&, cv::_OutputArray const&)", referenced from: 
     MxArray::toMat(int, bool) const in libMxArray.a(MxArray.o) 
    "cv::split(cv::Mat const&, std::vector<cv::Mat, std::allocator<cv::Mat> >&)", referenced from: 
     MxArray::MxArray(cv::Mat const&, mxClassID, bool) in libMxArray.a(MxArray.o) 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

    mex: link of ' "+cv/CamShift.mexmaci64"' failed. 

make: *** [+cv/CamShift.mexmaci64] Error 255 

我不知道是什么在这一点上做。是否有可能在我的系统上构建mexopencv?

+0

Mac中没有文档。但是如果make进入CamShift,那意味着你可以先编译所有其他文件?你有没有尝试删除CamShift.cpp? – Vuwox

+0

看看[这个](http://stackoverflow.com/questions/16078512/undefined-symbols-for-architecture-x86-64-error-when-linking-opencv-in-xcode) – Vuwox

+0

@AlexandreBizeau,if我删除了CamShift,我在下一个文件Canny中得到了同样的错误信息。您提到的另一篇文章是在Xcode中构建OpenCV,而不是使用Matlab的mex命令来构建mexopencv。 –

回答

7

我终于想通了我的问题,其中的解决方案导致了其他问题,我最终解决了这个问题。所以这里有一个完整的循序渐进的过程,让我在我的系统上运行mexopencv(一些步骤将从我原来的问题中重复出现)。

  1. 获取mexopencv从http://www.cs.sunysb.edu/~kyamagu/mexopencv/
  2. 落实Mathworks workaround得到了Matlab MEX编译器内Matlab的
  3. 修改新创建的〜/ .matlab/R2013b在Xcode 5个工作

  4. 运行mex -setup/mexopts.sh文件如下:

    1. 将“-lstdC++”的所有引用替换为“-lC++”
    2. 将以下参数添加到CXXFLAGS变量中:“-std = gnu ++ 11 -stdlib = libC++”。这两个步骤确保您使用C++ 11而不是C++ 98(感谢this stack overflow post)。
    3. 您应该已经替换文本 “10.7” 的所有实例与 “10.8” 从前面的步骤
    4. 更改线路

    MLIBS="-L$TMW_ROOT/bin/$Arch -lmx -lmex -lmat"

    MLIBS="$TMW_ROOT/bin/$Arch/libmx.dylib $TMW_ROOT/bin/$Arch/libmex.dylib $TMW_ROOT/bin/$Arch/libmat.dylib" 
    

    这确保编译器不搜索$TMW_ROOT/bin/$Arch中的OpenCV库,在我的系统上,该库评估的结果为/Applications/MATLAB_R2013b.app/bin/maci64。无论出于何种原因,来自旧版OpenCV(2.4.2)的库都随Matlab一起提供,并位于该文件夹中(也许它们随计算机视觉系统工具箱一起提供)。[注意:这一步可能没有必要]

  5. 创建一个文件夹/Applications/MATLAB_R2013b.app/bin/maci64/libopencv,并将所有libopencv*.dylib文件从/Applications/MATLAB_R2013b.app/bin/maci64到该文件夹​​。这可以防止链接器发现并意外链接到此旧版本的OpenCV。
  6. 使用Matlab命令将macports的pkg-config命令添加到Matlab路径setenv('PATH', [getenv('PATH') ':/opt/local/bin']);为了避免在每次启动Matlab时输入此命令,可以将其添加到您的startup.m文件中。我的生活在~/Documents/MATLAB/startup.m
  7. 请确保您在Matlab中运行mexopencv.make('clean', true);以删除编译mexopencv之前的任何失败尝试
  8. 在Matlab中运行mexopencv.make;它应该可以正常工作(有一些警告),并且在五分钟左右您将拥有MEX编译版本的OpenCV;恭喜!但是你还没有完成。

我尝试了我安装的OpenCV用简单的一行测试:

imshow(cv.Canny(rgb2gray(imread('peppers.png')), [10 100])) 

当我试图在这一点上运行它,我得到了以下错误消息:

>> imshow(cv.Canny(rgb2gray(imread('peppers.png')), [10 100])); 
Error using cv.Canny 
Invalid MEX-file '/Users/dgolden/software/cpp/mexopencv/+cv/Canny.mexmaci64': dlopen(/Users/dgolden/software/cpp/mexopencv/+cv/Canny.mexmaci64, 6): Library not loaded: 
/opt/local/lib/libtiff.5.dylib 
    Referenced from: /opt/local/lib/libopencv_highgui.2.4.dylib 
    Reason: Incompatible library version: libopencv_highgui.2.4.dylib requires version 8.0.0 or later, but libtiff.5.dylib provides version 6.0.0 

问题是Matlab有自己版本的一些macports安装的库,包含在/Applications/MATLAB_R2013b.app/bin/maci64中,它们与/opt/local/lib中的不同。默认情况下,Matlab会尝试动态链接自己版本的库,这些版本不是OpenCV预期的版本,所以程序不会运行。

该解决方案是在mexopencv附带的README.markdown文件中建议的。您需要告诉Matlab不要使用自己版本的共享库,而要使用/opt/local/lib的版本。

您可以通过以下两种方法之一来完成这一操作。首先,尝试运行您的程序并记下产生错误的库的名称。然后,请执行以下任一操作:

  1. 在/Applications/MATLAB_R2013b.app/bin/maci64中查找库文件并重命名或移动它。例如,将/Applications/MATLAB_R2013b.app/bin/maci64/libtiff.5.dylib重命名为/Applications/MATLAB_R2013b.app/bin/maci64/libtiff.5.dylib.bak。如果其他Matlab功能依赖于该库,则可能会产生意想不到的后果。你不需要做任何事情,OpenCV就可以在/opt/local/lib中找到正确的库。
  2. 关闭Matlab和首先设置DYLD_INSERT_LIBRARIES环境变量,像在命令行中启动它:

    DYLD_INSERT_LIBRARIES=/opt/local/lib/libtiff.5.dylib /Applications/MATLAB_R2013b.app/bin/matlab &

    在我的情况后,我与libtiff.5.dylib解决了这个问题,我也有一个问题libfreetype.6.dylib,所以补充到DYLD_INSERT_LIBRARIES变量,如:

    DYLD_INSERT_LIBRARIES=/opt/local/lib/libtiff.5.dylib:/opt/local/lib/libfreetype.6.dylib /Applications/MATLAB_R2013b.app/bin/matlab &

然后尝试再次运行您的程序。如果出现另一个库版本错误,请继续迭代,并重命名/移动来自/Applications/MATLAB_R2013b.app/bin/maci64的库或将正确的库路径添加到DYLD_INSERT_LIBRARIES变量。最终,它应该工作!

我遵循了所有这些步骤后,我能够成功运行我的MATLAB命令:

imshow(cv.Canny(rgb2gray(imread('peppers.png')), [10 100])) 

让我知道,如果这些步骤或者你没有工作,我是否跳过任何​​步骤或使事情变得比原来更复杂。

我希望这可以帮助别人!我花了好几天的时间来梳理互联网,并打扰哥打,终于找到了正确的解决方案。

+0

运行mexopencv.make时出现错误; 'src/MxArray.cpp中包含的文件:6: include/MxArray.hpp:14:10:致命错误:'opencv2/opencv.hpp'文件未找到 #include“opencv2/opencv.hpp”更多信息这里的错误:http://pastie.org/private/wstqunwnwqhfm547qxlkw – melwil

+0

搜索一下这个问题,我发现https://github.com/kyamagu/mexopencv/issues/90。从命令行以通常的方式运行make在运行步骤1-5后似乎适用于我,如果我不回报,它对我有用。 – melwil