先講我的環境,我用的是macbook pro,osx 版本是10.9.2,我的matlab一開始是2013a,後來換成了2013b。
1. 先安裝openCV
果然跑不掉,還是要先安裝openCV。一開始傻傻的下載source自已make,自已complie,後來高人指點,用macports或是homebrew。雖然一些網站,和日本東大強者的網頁都是使用macports來安裝。但我的朋友建議使用homebrew來安裝。畢竟homebrew不需要用sudo就可以安裝程式。(另外發現,homebrew和macports也可以安裝ITK喔!)
在shell中輸入以下指令來安裝homebrew:
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
然後再輸入:
brew tap homebrew/science brew install opencv
等個幾分鐘,openCV就裝好了。
但是安裝openCV後,才發現兩者可安裝的版本是不一樣的。macports可以安裝到最新的2.4.8版,但是homebrew只有2.4.7.1,應該常用的函數差不了太多吧(自行安慰自已)。第二個差異是在openCV放置的位置,macports是放置在/opt/... ,而homebrew是放置在/usr/...。第三個差異在dependence的安裝,用macport,似乎會把全部用到的dependence全部安裝好,但是homebrew似乎就只裝好最必要的部份,像ffmpeg就不會自動幫你裝到好。
這一部份,可以再參考Installing OpenCV on Mac Mountain Lion/Mavericks來用homebrew安裝。
附帶的是手動安裝openCV的方法,以及另一個手動安裝openCV的方法。
2. pkg-config要安裝
還有一個重要的dependence,就是pkg-config要安裝。基本上安裝openCV時,都會裝好,只是後面matlab要呼叫它時,必需記得下指令:setenv('PATH', [getenv('PATH') ':/opt/local/bin']);
後面要用到時,我會再提一次。
3. 安裝xcode
我們使用xcode當compiler。不必用homebrew安裝gcc48等等的來用(其實我安裝時遇到了error,一個dependence無法安裝)。這一部份算是最簡單的,只要從mac的app store直接搜尋xcode、下載、安裝、就可以了。基本上是全自動的,我安裝的是5.0.1版。
有人說要再安裝command line tools of xcode。其實我爬文的結果,command line tools of xcode是有的,只是換位置了。你可以試著在shell中打:
gcc --version
如果沒有error,有顯示版本號,就沒問題啦!
4. 修改matlab相關的參數
要compile出matlab要的.mexmaci64,必需用到matlab、osx等的一些功能和函數庫。也要告訴matlab,要用那一個compiler等等的資訊。這些都寫在mexopts.sh之中。請看Can I use Xcode 4.2 to 4.6 as my C or C++ compiler in MATLAB?(Updated: 2013/02/04)
不過,它只提供到osx 10.8的patch:optsPatch10.8.patch,並沒有10.9 mavericks的。其實無所謂,因為mac osx 10.9其實也有包括10.8的SDK在(在/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/就可以看到兩個併存)。而下面的步驟也可以再做修改,改到10.9的SDK去。下載好,到你的matlab根目錄中(我的電腦是在:/Applications/MATLAB_R2013a.app/bin/)解壓縮就好。可以在matlab中執行以下code:
cd(matlabroot) !unzip -o ~/Downloads/optsPatch10.8.patch
然後,再在matlab中執行以下code,把mexopts.sh拷貝到matlab的工作目錄中:
mex -setup
再來,根據mexopenCV官網必需對工作目錄的mexopts.sh這個檔案做處理。可以直接在matlab中執行edit來做:
edit /Users/chaoh2/.matlab/R2013b/mexopts.sh
找到相對應的值,用以下的陳述替換掉:
CC='clang' CXX='clang++' SDKROOT='/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/' MACOSX_DEPLOYMENT_TARGET='10.9' CLIBS="$CLIBS -lc++" CXXFLAGS="-fno-common -no-cpp-precomp -fexceptions -arch $ARCHS -isysroot $SDKROOT -mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET -std=c++11 -stdlib=libc++ -DCHAR16_T" CXXLIBS="$MLIBS -lc++"
至此,理論上已經完成所有的前置工作。行有餘力,可以再參考這一篇自問自答Compiling mexopencv in OS X 10.9 with Xcode 5 and Matlab R2013b,來處理之。
不過,我還是遇到一堆錯誤,像:
Undefined symbols for architecture x86_64: ld: symbol(s) not found for architecture x86_64
像
In file included from src/MxArray.cpp:6: In file included from include/MxArray.hpp:14: In file included from /Applications/MATLAB_R2013b.app/extern/include/mex.h:58: In file included from /Applications/MATLAB_R2013b.app/extern/include/matrix.h:252: /Applications/MATLAB_R2013b.app/extern/include/tmwtypes.h:830:9: warning: 'CHAR16_T' macro redefined #define CHAR16_T ^:2:9: note: previous definition is here #define CHAR16_T 1 ^
快瘋掉了。
沒有留言:
張貼留言