新・オノマトペ的備忘録

技術ブログだと思った? 残念、日記でした!

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 をインストールはできるけど,MATLABg++-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 とか Fortrangcc_glnxa64.xml なり gfortran.xml なりを同じように編集すればいいんだと思う.

問題点とか

  • ~/.matlab/R2016a/mex_C++_glnxa64.xml が存在する(mex -setup すると生成される?)とここの設定がオーバーライドされるっぽいので,消しておく
  • 公式に案内されてる方法ではない気がするので,バージョン変わっても同じ方法でできる保証はない