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は無料で環境構築できないため、この時点でバインディングのビルドを断念する人も居そうです。この部分を書き換えて何とかしている例がいくつかありました。
http://programming.jugglershu.net/programming/articles/rubyext.html
http://ronspace.cocolog-nifty.com/blog/2009/02/ruby-pg-windows.html
‥いいのかな?動くならそれでもいいんでしょう。この記事では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::create
と MeCab::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のものに従います。