MATLAB MEX 指定したコンパイラーコマンドでコンパイルしてほしい
前提
Ubuntu 16.04(以下 Xenial)な共用マシンに MATLAB R2016a(以下 R2016a) が入ってる.
C++ で書かれたライブラリを MEX する必要があった.
ふつうに MEX コマンド実行すると g++ が呼ばれるんだけど,Xenial での g++ という名前のバイナリの実態は GCC 5.4.0 に含まれる C++ コンパイラになる.
一方で,R2016a が公式で対応してるのは GCC 4.7.x で,実際 g++ 5.4.0 を使って mex
すると MATLAB が持ってる libstdc++.so が古いために MATLAB 上では動かないバイナリが生成される.
Xenial では g++-4.7
というパッケージ名で g++-4.7
というファイル名の g++ 4.7.0 をインストールはできるけど,MATLAB に g++-4.7
をどう使わせるか,というのがこのエントリでする話.
解決法 1 - mex
コマンドの引数に 'CC=gcc-4.7'
を追加
既定のコンパイラの変更 - MATLAB & Simulink - MathWorks 日本
mexで使うコンパイラを指定する - Qiita
ここらで言ってるように, $CC
とか $GCC
を変更すれば MEX はそのコンパイラを利用してコンパイルしてくれる.
問題点
- 弊ラボの人間はこういうテクに明るくないので,いつでもこれを思い出して適切に MEX 呼び出しを書き変えられるかと言わるるとまあ無理だろって思う
- わかっててもいちいち書き直すのは面倒
解決法 2 - 設定ファイルを書き変える
どこかのページではっきり解説されたりしてる方法ではないんだけど,$matlabroot/bin/glnxa64/mexopts/g++_glnxa64.xml
の
<locationFinder> <GCC> <cmdReturns name="which g++" /> </GCC> <CPPLIB_DIR> <cmdReturns name="g++ -print-file-name=libstdc++.so"
てなあたりを
<locationFinder> <GCC> <cmdReturns name="which g++-4.7" /> </GCC> <CPPLIB_DIR> <cmdReturns name="g++-4.7 -print-file-name=libstdc++.so"
と書き変えると mex
コマンドが g++-4.7
を使ってくれるようになった.
たぶん,C とか Fortran も gcc_glnxa64.xml
なり gfortran.xml
なりを同じように編集すればいいんだと思う.
問題点とか
~/.matlab/R2016a/mex_C++_glnxa64.xml
が存在する(mex -setup
すると生成される?)とここの設定がオーバーライドされるっぽいので,消しておく- 公式に案内されてる方法ではない気がするので,バージョン変わっても同じ方法でできる保証はない