その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

Text::MeCab を CentOS にインストールする際の注意

Text::MeCab 入れたいけどコケるのよ!!! という方に向けた記事のはずでしたが、
もはや Text::MeCab とか関係ない感じの記事になったことを報告します。

Mecab 自体のインストールについては言及しません。
以下に記すサイトが詳しいのでご参照下さい。
http://d.hatena.ne.jp/eth0jp/20130407/1365278478

結論

さて結論から言うとこうです。以下のどちらかをキメればなんとかなる場合が多い。

  • LD_LIBRARY_PATH に `/usr/local/lib` *1 を加える
  • `/etc/ld.so.conf.d/` 以下にconf ファイル (例えば local.conf というファイル) を配置し、そこに`/usr/local/lib` *2 を書き加える

なんだか、前者よりも後者の方が良い感じがします。
詳細な手順は後述します。


なお、今回の環境は以下のとおりですが、バージョン違っても大体は当てはまるのでは無いかと思います。

  • CentOS: 6.4
  • Perl: 5.16.3
  • 入れようとしている: Text::MeCab 0.20014

前説

今回はたまたま Text::MeCab を題材に取りましたが、別にこれは Text::MeCab に限った話ではありません。
CPAN には外部ツールをバインディングするモジュールが数多く存在します。
(そういうモジュールをインストールする時には、もちろんその外部ツールがインストールされている必要があります)

で、そうしたモジュールをインストールしようとすると、ときたま *3 「外部ツールをインストールしたはずなのに、動的ライブラリが無いって言われるワ」というエラーにぶち当たってインストールがコケる場合があります。

その際にはこんな感じのログが出ます (Text::MeCab の例)

Detected the following mecab information:
version: 0.996
cflags: -I/usr/local/include -DMECAB_MAJOR_VERSION=0 -DMECAB_MINOR_VERSION=996 -I src
libs: -L/usr/local/lib -lmecab -lstdc++
include: /usr/local/include
/home/vagrant/.cpanm/work/1377188088.28582/Text-MeCab-0.20014/assertlibHocy6T8h: error while loading shared libraries: libmecab.so.2: cannot open shared object file: No such file or directory
/home/vagrant/.cpanm/work/1377188088.28582/Text-MeCab-0.20014/assertlibsemL9gsi: error while loading shared libraries: libmecab.so.2: cannot open shared object file: No such file or directory
wrong result: 'mecab', 'mecab'

  • > N/A
  • > FAIL Configure failed for Text-MeCab-0.20014. See /home/vagrant/.cpanm/work/1377188088.28582/build.log for details.

原因

特にオプションを付けずに MeCab をインストールすると、MeCab は `/usr/local/` 以下にインストールされます。
ところが、CentOSは `/usr/local/lib` をデフォルトで読み込んではくれません。すると悲劇が起こる。
(他の Linux ディストリビューションに関しては詳しく調べていないのでわかりません……)

だったら

普通に、動的ライブラリを読み込みに行くパスにソイツを追加してやればOK!!!!

解決策1: LD_LIBRARY_PATH に追加

以下のように、`/usr/local/lib` を LD_LIBRARY_PATH に追加するという方法があります。

$ echo 'export LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH"' >> ~/.bashrc
$ source ~/.bashrc

(.bashrc の部分は適宜環境にあわせて変更を加えて下さい)

解決策2: `/etc/ld.so.conf.d/` 以下にconf ファイルを配置する

あるいは、以下のように`/etc/ld.so.conf.d/` 以下にconf ファイル (今回は local.conf というファイル) を配置し、そこに`/usr/local/lib`を書き加えるという方法もあります。

# echo '/usr/local/lib' >> /etc/ld.so.conf.d/local.conf
# ldconfig

どちらの解決策が良いのか

http://yancha.hachiojipm.org/quot?id=100507,100506,100505,100500,100481,100479,100477
f:id:moznion:20130823014632p:plain
とのことです。

*1:場合によっては違うファイルパスの場合がある。適宜状況・環境に応じて

*2:こちらも状況に応じて

*3:というか、CentOS を使っていると