Date: 2011-05-04
Tags: windows, ruby

MeCab-0.98 ruby binding for Windows のビルド

Rubyで MeCab を使用するには MecCab-rubyバインディング を使用しますが、バンディングはビルド済みのものが提供されていないので、自分でビルドする必要があります。Linuxや*BSDならそれほどはまらないですが(実際CentOSでは簡単に出来た)、Windowsではコンパイル環境があってもはまったので、バインディングビルド手順をメモしておきます(完成物はこちら: mecab-ruby-0.98-win32-binary-20110504.zip)。

バインディングをビルドせずに何とかする代替案

バインディングをビルドしようとして調べたら、代替案が色々あったのでまとめてみました。

bindingをビルドせずにプロセス呼び出しで使う例

ビルドするのが(実施や維持などが)難しいということで、shell経由で外部呼び出しして結果を手に入れる方法もいくつかあります。shell経由はデータ長(2047文字?)の上限など問題がありそうですが、テンポラリファイル経由でデータを渡す事でなんとかしているパターンもありますね。

libmecab.dllを直接呼び出す

データ長(2047文字?)問題を回避するスマートな方法として、libmecab.dllを使う方法も提案されてました。libmecab.dllは MeCab-0.98 for Windows (mecab-win32) に同梱されています。

バインディングをビルドする手順

この記事で対象にしているバージョン

  • WindowsXP, 7 (95以降共通と思われる)

  • ActiveRuby-1.8.7-p300

  • MeCab-0.98

  • mecab-ruby-0.98.tar.gz

  • VisualStudio 6

環境の用意

Windowsを用意します。そこにRuby-1.8.7(ActiveRuby), MeCab-0.98, VisualStudio6をインストールしておきます。

Ruby-1.8がVisualStudio6でビルドされているのでVS2008で動くようにする例

ruby-1.8libruby1.8i386-mswin32config.h を見ると _MSC_VER: 1200 is expected. と書かれていますね。VS6は無料で環境構築できないため、この時点でバインディングのビルドを断念する人も居そうです。この部分を書き換えて何とかしている例がいくつかありました。

‥いいのかな?動くならそれでもいいんでしょう。この記事ではVisualStudio6で話を進めます。

mecab-ruby-0.98.tar.gz を展開してextconf.rbを書き換え、Makefileを作成する

Step1

mecab-ruby-0.98.tar.gz に同梱されているextconf.rbには以下のような行があります:

`mecab-config --libs-only-l`.chomp.split.each { | lib |

しかしWindowsではMeCabをインストールしてもmecab-configが無いのでこのままでは動きません。そこで以下のように書き換えます。

元のextconf.rb:

require 'mkmf'

mecab_config = with_config('mecab-config', 'mecab-config')
use_mecab_config = enable_config('mecab-config')

`mecab-config --libs-only-l`.chomp.split.each { | lib |
  have_library(lib)
}

$CFLAGS += ' ' + `#{mecab_config} --cflags`.chomp

have_header('mecab.h') && create_makefile('MeCab')

書き換えたextconf.rb:

require 'mkmf'

$CFLAGS += ' -IC:\Develop\Mecab\sdk'
$LOCAL_LIBS += ' libmecab.lib'
$LIBPATH << 'C:\Develop\Mecab\sdk'

have_header('mecab.h') && create_makefile('MeCab')

上記は、MeCabが C:\Develop\Mecab\ にインストールされている場合です。それ以外にインストールしている場合は適宜パスを書き換えて使用してください。

Step2

ruby extconf.rb を実行してMakefileを生成します。

nmakeを実行するために環境をセットアップする

VisualStudio6のnmakeを実行出来るように、vcvars32.batを実行してからnmakeします。

nmakeを実行するとビルドに失敗するのでコードを書き換える

nmakeを実行してMeCab.soをビルドします。

エラーになりました。上記にあるエラーメッセージでGoogleで検索しても解決策は見つかりませんでした(みんな同じところで引っかかってるというのは見つかりましたが)。そこで、エラーの原因を調べてみたところ、 MeCab::Tagger::createMeCab::Tagger::version という2つのsingletonメソッドが原因っぽいので、ここはスッパリとこの2つのメソッドをあきらめる方向で対策してみます。

MeCab_wrap.cpp の以下の2行を削除します(4973行あたり)。singletonの定義部分:

rb_define_singleton_method(SwigClassTagger.klass, "create", VALUEFUNC(_wrap_Tagger_create), -1);
rb_define_singleton_method(SwigClassTagger.klass, "version", VALUEFUNC(_wrap_Tagger_version), -1);

これでビルドが通るはず。

改めてnmakeを実行してMeCab.soを作成する

改めてnmakeを実行してMeCab.soをビルドします。

これでMeCab.soが作成出来ました。

完成物と変更を加えたファイルを公開しておきます。ライセンスなどは元のMeCabのものに従います。