用Xcode 5和Matlab R2013b在OS X 10.9中编译mexopencv
我有兴趣在我的系统上使用以下规格:用Xcode 5和Matlab R2013b在OS X 10.9中编译mexopencv,xcode,matlab,opencv,mex,Xcode,Matlab,Opencv,Mex,我有兴趣在我的系统上使用以下规格: OSX10.9(小牛) Xcode 5 Matlab 2013b OpenCV通过macports安装到/opt/local/include/{OpenCV,opencv2}和/opt/local/lib 我使用mexopencv网站上的命令克隆了最新的OpenCV版本;这是版本084838d62a25fcb3eec9f610abf91b167bc6c2f5,自2013年7月20日星期六05:18:37-0700 我运行了Matlab的mex-setup命
- OSX10.9(小牛)
- Xcode 5
- Matlab 2013b
- OpenCV通过macports安装到/opt/local/include/{OpenCV,opencv2}和/opt/local/lib
mex-setup
命令,然后从Mathworks实现,使用Xcode 5作为我的mex编译器
我使用Matlab命令setenv('path',[getenv('path'):/opt/local/bin'])将macports的pkg config命令添加到路径中代码>
现在,运行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
>> 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
架构x86_64的未定义符号:
“cv::merge(std::vector const&,cv:_outputarrayconst&)”,引用自:
MxArray::libMxArray.a(MxArray.o)中的toMat(int,bool)常量
“cv::split(cv::Mat const&,std::vector&)”,引用自:
libMxArray.a(MxArray.o)中的MxArray::MxArray(cv::Mat const&,mxClassID,bool)
ld:找不到架构x86_64的符号
叮当声:错误:链接器命令失败,退出代码为1(使用-v查看调用)
mex:“+cv/CamShift.mexmaci64”的链接失败。
make:**[+cv/CamShift.mexmaci64]错误255
我不知道现在该怎么办。有可能在我的系统上构建mexopencv吗?我终于解决了我的问题,解决了这个问题,我最终解决了其他问题。所以这里有一个完整的一步一步的程序,我是如何让mexopencv在我的系统上工作的(一些步骤将从我最初的问题中重复)
mex-setup
MLIBS=“-L$TMW\u ROOT/bin/$Arch-lmx-lmex-lmat”
到
这确保编译器不会在$TMW\u ROOT/bin/$Arch
中搜索OpenCV库,在我的系统上,该库的计算结果为/Applications/MATLAB\u R2013b.app/bin/maci64
。无论出于何种原因,旧版本OpenCV(2.4.2)中的库随Matlab一起提供,并保存在该文件夹中(可能随计算机视觉系统工具箱一起提供)。[注意:此步骤可能没有必要]
/Applications/MATLAB_R2013b.app/bin/maci64/libopencv
,并将所有libopencv*.dylib
文件从/Applications/MATLAB_R2013b.app/bin/maci64
移动到该文件夹中。这可防止链接器查找并意外链接到此旧版本的OpenCVsetenv('path',[getenv('path'):/opt/local/bin'])将macports的pkg config命令添加到Matlab路径
为了避免每次启动Matlab时都输入此命令,可以将其添加到startup.m
文件中。我的生活在~/Documents/MATLAB/startup.m
中mexopencv.Make('clean',true)在Matlab中编写>以清除先前编译mexopencv时失败的任何尝试
mexopencv.make
;它应该可以正常工作(带有一些警告),五分钟左右你就会有一个MEX编译版的OpenCV;祝贺但你还没做完imshow(cv.Canny(rgb2gray(imread('peppers.png')), [10 100]))
当我试图在此时运行它时,我收到以下错误消息:
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
>> 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附带的自述文件中建议了解决方案。您需要告诉Matlab不要使用自己版本的共享库,而是使用/opt/local/lib
中的版本
你可以用两种方法中的一种。首先,尝试运行您的程序,并记下产生错误的库的名称。然后,要么:
在/Applications/MATLAB_r2013 b.app/bin/maci64中找到库文件,然后重命名或移动它。例如,将/Applications/MATLAB_r2013 b.app/bin/maci64/libtiff.5.dylib
重命名为/Applications/MATLAB_r2013 b.app/bin/maci64/libtiff.5.dylib.bak
。如果其他Matlab功能依赖于该库,这可能会产生意想不到的后果。为了让OpenCV在/opt/local/lib
中找到正确的库,您不需要做任何其他事情
关闭Matlab并从命令行启动它,首先设置DYLD\u INSERT\u库
环境变量,如:
DYLD\u INSERT\u库=/opt/local/lib/libtiff.5.dylib/Applications/MATLAB\u r2013 b.app/bin/MATLAB&
在我的例子中,在我解决了libtiff.5.dylib
的问题后,我也遇到了libfreetype.6.dylib
的问题,因此我将其添加到DYLD\u INSERT\u LIBRARIES
变量中,如下所示:
DYLD\u INSERT\u库=/opt/local/lib/libtiff.5.dylib:/opt/local/lib/libfreetype.6.dylib/Applications/MATLAB\u r2013 b.app/bin/MATLAB&
然后再次尝试运行您的程序。如果你得到一个