2016年5月19日木曜日

libsvmのインストール & Matlab用インタフェースのコンパイル


環境はMacOS10.11で、XcodeとCommand line toolsはインストール済み
MatlabはMatlab2013aバージョンを使用
mexは不慣れなものでエラーが出るととても困った

■ libsvm本体のインストール

libsvmのインストールは特にひっかかることなし
ダウンロードして展開したlibsvmのディレクトリ上で
     $ make svm-train
     $ make svm-predict
あとはここにパスを通せば良い
~/.bashrcに以下を記述
     export PATH=$PATH:/Users/mtanaka/Documents/Softwares/libsvm-3.21
これで、svm-train、svm-predict、svm-scaleの3コマンドが使えるようになる

■ Matlab用インタフェースのコンパイル

2つ大きなエラーにあたった
一つはMacOSとMatlabのバージョンの不一致、もう一つはソースコード中に現れる謎のデータ型

1つ目、MacOS10.7のSDKが見つかりませんよ、というエラー


>> make
xcodebuild: error: SDK "macosx10.7" cannot be located.
xcrun: error: unable to find utility "clang", not a developer tool or in PATH

    mex: compile of ' "libsvmread.c"' failed.

Error: /Applications/MATLAB_R2013a.app/toolbox/matlab/general/mex.m failed (line 206)
Unable to complete successfully.
=> Please check README for detailed instructions.

これはmexopts.shというMatlab.app/binの下のファイルを修正すれば良い
mexのコンパイルの時に探すSDKを10.7から10.11に変更
つまり、mexopts.sh中の”10.7”を”10.11”に総置換した(もちろんバックアップは取ってから)

修正後、Matlabのコマンドライン上で
     >>> mex -setup
しなおして、このエラーは解決

2つ目、char16_t なる型に捕まる

このエラーから逃げられず、しばらく困った

>> make
In file included from libsvmread.c:7:
In file included from /Applications/MATLAB_R2013a.app/extern/include/mex.h:58:
In file included from /Applications/MATLAB_R2013a.app/extern/include/matrix.h:294:
/Applications/MATLAB_R2013a.app/extern/include/tmwtypes.h:819:9: error: 
      unknown type name 'char16_t'
typedef char16_t CHAR16_T;
        ^

どうやらmexでコンパイルするときに予め型の置換えを指定しておけば良いらしい
libsvm/matlabの下のmake.mを開いて、mexコマンドの*全て*にこのオプションを追加
以下、一例

修正前
mex CFLAGS="\$CFLAGS -std=c99" -largeArrayDims libsvmread.c

修正後
mex CFLAGS="\$CFLAGS -std=c99" -Dchar16_t=uint16_t -largeArrayDims libsvmread.c

これでコンパイルが通って、無事に*.mexmaci64ファイル群が生成された
あとはMaltabのパスにここを追加して、無事svmtrainコマンドが使えるようになった
よかとよかと

0 件のコメント:

コメントを投稿