gotagota日記

「面白きことは良きことなり」

Homebrew でいれた 古いバージョンの mecab が mecab-ruby といい感じにならない

以前書いた記事 古いバージョンの mecab を homebrew でいれたのでメモ とちょっとしたエラー対処 - gotagota日記 にある通り、 Homebrew で少し古めの mecab をいれたのですが、どうも mecab-ruby とうまいこといってない。

こんな感じのエラーが出ました。( PATH/TO/ の部分は各自の環境によって様々です)

dyld: lazy symbol binding failed: Symbol not found: __ZN5MeCab12getLastErrorEv
  Referenced from: /PATH/TO/MeCab.bundle
  Expected in: flat namespace

いろいろ調べました結果、これはライブラリの参照先が間違ってる場合におこるようです。

そこで、上のエラーメッセージにあります、 Referenced from: のうしろにあるパスをまるっとコピーして以下のコマンドに渡します。

$ otool -L /PATH/TO/MeCab.bundle

自分の場合は以下のように出ました。

/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
/usr/lib/libmecab.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)

このうち、 mecab とはいっている /usr/lib/libmecab.1.0.0.dylib は次で使うのでメモっておいてください。

次に

$ sudo install_name_tool -change "/usr/lib/libmecab.1.0.0.dylib" /usr/local/lib/libmecab.2.dylib  /PATH/TO/MeCab.bundle

として、本来使いたいパスを通します。

ここで、初めて出てきた /usr/local/lib/libmecab.2.dylib ですが、これが本来使いたいパスです。

つまりこのコマンドの構文は

sudo install_name_tool -change "古いパス" 新しいパス 適用したいファイル

といった感じです。

参考URL