MinGW で MeCab をビルドする (Windows 8 / ActivePerl 5.16)
- 過去にMinGW で MeCab をビルドする という記事を書いたが、その後 OS も Perl のバージョンも変わり、MinGW 自体も更新されたので、メモを改める。
- 環境、MinGW のインストール、ActivePerl のインストールまでは、MinGW で Text::Kakasi をビルドする と同じ。
MeCab のビルド、インストール
MeCab 0.98 以降は、まだビルドできてないので、古いバージョンだが、0.97 で。
- MeCab 0.97 を [ダウンロード] する
- C:\MinGW\msys\1.0\home\(ユーザ名) が、MSYS のホームディレクトリになるので、そこへコピーする
- $ cd /path/to/downloaded/binary
- $ tar xzf mecab-0.97.tar.gz
- $ cd mecab-0.97
- MinGW で MeCab をビルドする と同様に、src/mecab.h と src/libmecab.cpp にパッチをあてる。
- また、src/mecab.h の最後に「#undef stat」を追加しておく。そうしないと、「... has no member named '_stat64i32'」というようなエラーが出てしまう。「stat」というメンバ名が、sys/stat.h で定義で置き換えられてしまうのが原因のようだが、ちゃんと調べてない。
- さらに、libmecab.cpp の「std::locale("japanese")」を「std::locale("C")」としておかないと、実行時に「locale::facet::_S_create_c_locale name not valid」というエラーが出てしまったので、これも改める。結局、libmecab.cpp の変更点は以下。
- --- libmecab.cpp.orig 2007-11-26 02:27:12 +0900
- +++ libmecab.cpp 2014-02-15 15:22:51 +0900
- @@ -50,19 +50,19 @@
- #if defined(_WIN32) && !defined(__CYGWIN__)
- HINSTANCE DllInstance = 0;
-
- -#ifdef __cplusplus
- +#if defined(__cplusplus) && !defined(__MINGW32__)
- extern "C" {
- #endif
- BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID) {
- if (!DllInstance) {
- DllInstance = hinst;
- }
- - std::locale loc(std::locale("japanese"),
- + std::locale loc(std::locale("C"),
- "C", std::locale::numeric);
- std::locale::global(loc);
- return TRUE;
- }
- -#ifdef __cplusplus
- +#if defined(__cplusplus) && !defined(__MINGW32__)
- }
- #endif
- #endif
- $ ./configure
- ここで、なぜか「checking for iconv_open in -liconv」のところでテストが失敗してしまって、Makefile の LIBS に「-liconv」が入ってくれないので、以下のパッチをあてる。
- --- Makefile_orig 2014-02-15 15:13:45 +0900
- +++ Makefile 2014-02-15 15:14:21 +0900
- @@ -128,7 +128,7 @@
- LDFLAGS =
- LIBICONV = -liconv
- LIBOBJS =
- -LIBS = -lstdc++
- +LIBS = -liconv -lstdc++
- LIBTOOL = $(SHELL) $(top_builddir)/libtool
- LN_S = cp -p
- LTLIBICONV = -liconv
- $ make
- $ make install
MeCab Perl binding のビルド、インストール
- MeCab 0.97 の Perl binding を [ダウンロード] する
- MeCab と同様にコピーする
- $ cd /path/to/downloaded/binary
- $ tar xzf mecab-perl-0.97.tar.gz
- ここで、このままだとヘッダとライブラリをなぜか見つけてくれないので、Makefile.PL を修正する
- --- mecab-perl-0.97/Makefile.PL 2008-02-03 19:13:41 +0900
- +++ mecab-perl-0.97_mod/Makefile.PL 2014-02-15 14:43:34 +0900
- @@ -1,10 +1,11 @@
- use ExtUtils::MakeMaker;
- WriteMakefile(
- 'NAME' => 'MeCab',
- - 'CC' => `mecab-config --cxx`,
- - 'LD' => `mecab-config --cxx`,
- - 'INC' => `mecab-config --cflags`,
- - 'LIBS' => `mecab-config --libs`,
- - 'VERSION' => `mecab-config --version`,
- + 'CC' => 'g++',
- + 'LD' => 'g++',
- + 'INC' => '-IC:\MinGW\msys\1.0\local\include',
- + 'LIBS' => '-LC:\MinGW\msys\1.0\local\lib -lmecab -liconv -lstdc++',
- + 'LDDLFLAGS' => '-mdll -L"C:\Perl\lib\CORE" -static-libgcc -static-libstdc++',
- + 'VERSION' => '0.97',
- 'OBJECT' => 'MeCab_wrap.o'
- );
- LDDLFLAGS も変更しているが、これをしないと「libgcc_s_dw2-1.dll」「libstdc++-6.dll」に依存したバイナリになってしまうため
- $ cd mecab-perl-0.97
- $ perl Makefile.PL
- $ dmake
- $ dmake install
PPD の作成
- $ dmake ppd
- 「MeCab.ppd」ができるので、CODEBASE HREF="" のところに、これから作るアーカイブの相対パスを入れる(例えば、同じディレクトリに「MeCab.tar.gz」を作るなら、ファイル名だけで ok)
- $ tar czf MeCab.tar.gz blib
- 「blib」ディレクトリの中にビルドされた内容が入っているので、これを tar で固める(+ gzip で圧縮する)
辞書と設定ファイル
Windows 用バイナリを利用する場合
- MeCab の Window 用バイナリを [ダウンロード]してインストールしておけば、C:\Program Files\MeCab\etc\mecabrc に設定ファイル、C:\Program Files\MeCab\dic\ipadic に辞書がインストールされるので、そのままで動作する。
ビルドして作成する場合
- $ ./configure
- $ make
- $ make install
- 設定ファイルは、/usr/local/etc/mecabrc (Windows 上では C:\MinGW\msys\1.0\local\etc\mecabrc)に作成されるが、Windows 環境でビルドすると C:\Program Files\MeCab\etc\mecabrc を探しにいくようになっている
- このままだと設定ファイルを見つけてくれないので、MECABRC 環境変数を設定して対応する。辞書ファイルのパスは、設定ファイル内の dicdir で指定する。「$(rcpath)」で設定ファイルのパスがとれるので、そこからの相対パスで指定するのがよい。
成果品
- http://amatubu.skr.jp/ppm/MeCab.ppd
MeCab.dll が依存している DLL
- Dependency Walker 調べ
- KERNEL32.DLL
- MSVCRT.DLL
- ADVAPI32.DLL
- PERL516.DLL