2013年12月15日 星期日

mex編譯環境設定


mex是matlab提供的編譯器,可以在matlab編譯外部的c/cpp(也許還有fortran =w=?)程式,可以用matlab的方式把資料塞給外部程式,回傳資料也可以用matlab收下來。

幹嘛沒事叫外部程式,用matlab寫不就好了?據同學強強林的說法是編外部的cpp code會跑得比較快,實際情形是如何其實作者也是啊哈哈不是很清楚。

最近因為修課的關係需要用到matlab mex,就順手編了一下,把過程記錄一下:

--

因為mex是用其他編譯器來編譯,因此要先設定系統的c/cpp編譯器

如果是Unix/MacOS的話,大概都已經裝了gcc/g++了,在matlab內打mex -setup,應該可以看到選項;windows的話請看參考資料一,這部分沒有研究。
這裡會遇到一個問題是,matlab未必支援最新版的gcc/g++,要看你的matlab版本
我是2012a版支援到gcc 4.4.6,偏偏我用archlinux,套件幾乎都會升到最新(4.8.2),這時候matlab就會回報用了太新版本的gcc。

解決方式是安裝舊版的gcc/g++ 如果是archlinux的話可以用AUR安裝,其他發行版應該有自己的解決方式。
因此先重編了4.4.6,桌電上50MB的檔案我編了快1hr …(結果筆電用-j8下去編跑得桌電快lol)

--

接著要設定gcc版本,在matlab安裝路徑(我的是/opt/MATLAB/R2012a)下有bin/mexopts.sh,把裡面的gcc/g++都換成舊版的
# C++keyName: GNU C++
# C++keyManufacturer: GNU
# C++keyLanguage: C++
# C++keyVersion:
CXX='g++' <-換掉這行g++ → g++-4.4
CXXFLAGS='-ansi -D_GNU_SOURCE'
CXXFLAGS="$CXXFLAGS -D_FILE_OFFSET_BITS=64"
CXXFLAGS="$CXXFLAGS -fPIC -pthread"
CXXLIBS="$RPATH $MLIBS -lm"
CXXOPTIMFLAGS='-O -DNDEBUG'
CXXDEBUGFLAGS='-g'

我是archlinux就是換成gcc-4.4/g++-4.4,其他發行版我不是很確定舊版裝好是像這樣加個版號,還是要把本來的gcc替代掉
接著在matlab裡面輸入
$mex -setup
代入舊版的gcc/g++,之後mex就可以正常使用囉。

參考資料:
1. http://www.physik3.gwdg.de/tstool/HTML/node9.html
2. archlinux AUR gcc44
https://aur.archlinux.org/packages/gcc44/

沒有留言:

張貼留言