Cygwin1.7にMeCab0.98+MeCab-rubyをインストールしたメモ

参照したページ

基本的にはこのページ見ればいいけど、mecab-rubyのインストールに別途手順が必要だった。

インストール: MeCab 0.98

$ ./configure --with-charset=utf-8 CPPFLAGS=-DNOMINMAX LIBS=-liconv --prefix=/usr/local
$ make
$ make install

prefixつけた以外は参照ページと同じ。
CPPFLAGSオプションつけない時はmakeでこける(なんか文法エラーで……)。こけ方は以下。

[05-19 22:33:55] $ make
make  all-recursive
make[1]: Entering directory `/cygdrive/c/home/build/mecab-0.98'
Making all in src
make[2]: Entering directory `/cygdrive/c/home/build/mecab-0.98/src'
/bin/sh ../libtool --tag=CXX   --mode=compile g++ -DHAVE_CONFIG_H -I. -I.. -DDIC_VERSION=102    -DMECAB_DEFAULT_RC="\"/usr/local/etc/mecabrc\""    -O3 -Wall  -c -o utils.lo utils.cpp
libtool: compile:  g++ -DHAVE_CONFIG_H -I. -I.. -DDIC_VERSION=102 -DMECAB_DEFAULT_RC=\"/usr/local/etc/mecabrc\" -O3 -Wall -c utils.cpp  -DDLL_EXPORT -DPIC -o .libs/utils.o
In file included from /usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/sstream:640,
                 from common.h:18,
                 from utils.cpp:32:
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/sstream.tcc: In member function `virtual typename std::basic_stringbuf<_CharT, _Traits, _Alloc>::int_type std::basic_stringbuf<_CharT, _Traits, _Alloc>::overflow(typename _Traits::int_type)':
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/sstream.tcc:102: error: expected unqualified-id before '(' token
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/sstream.tcc:104: error: expected unqualified-id before '(' token
make[2]: *** [utils.lo] Error 1
make[2]: Leaving directory `/cygdrive/c/home/build/mecab-0.98/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/cygdrive/c/home/build/mecab-0.98'
make: *** [all] Error 2

MeCab-ipadic

$ ./configure
$ make
$ make install

特に問題なくインストールできたので書くことはない

MeCab-ruby

$ ruby extconfig.rb
$ make
$ make install

の手順だと、makeでこける。

[05-19 22:37:08] $ make
g++ -I. -I. -I/usr/lib/ruby/1.8/i386-cygwin -I. -DHAVE_MECAB_H    -g -O2   -I/usr/local/include   -c MeCab_wrap.cpp
gcc -shared -s -o MeCab.so MeCab_wrap.o -L. -L/usr/lib -L.  -Wl,--enable-auto-image-base,--enable-auto-import,--export-all   -lruby -lstdc++  -ldl -lcrypt
MeCab_wrap.o: In function `_Z16new_MeCab_TaggerPKc':
/cygdrive/c/home/build/mecab-ruby-0.98/MeCab_wrap.cpp:1866: undefined reference to `MeCab::createTagger(char const*)'
/cygdrive/c/home/build/mecab-ruby-0.98/MeCab_wrap.cpp:1868: undefined reference to `MeCab::getTaggerError()'
MeCab_wrap.o: In function `_Z16new_MeCab_Taggerv':
/cygdrive/c/home/build/mecab-ruby-0.98/MeCab_wrap.cpp:1873: undefined reference to `MeCab::createTagger(char const*)'
/cygdrive/c/home/build/mecab-ruby-0.98/MeCab_wrap.cpp:1874: undefined reference to `MeCab::getTaggerError()'
MeCab_wrap.o: In function `_Z19_wrap_Tagger_createiPmm':
/cygdrive/c/home/build/mecab-ruby-0.98/MeCab_wrap.cpp:4213: undefined reference to `MeCab::Tagger::create(char const*)'
/cygdrive/c/home/build/mecab-ruby-0.98/MeCab_wrap.cpp:4178: undefined reference to `MeCab::Tagger::create(int, char**)'
MeCab_wrap.o: In function `_Z20_wrap_Tagger_versioniPmm':
/cygdrive/c/home/build/mecab-ruby-0.98/MeCab_wrap.cpp:4284: undefined reference to `MeCab::Tagger::version()'
collect2: ld returned 1 exit status
make: *** [MeCab.so] Error 1

mecabライブラリをうまく探してくれないのでリンク時にこけてる模様。やりかたがわからなかったのでruby extconf.rbで生成されるMakefileを直接編集して直した。

# before
ldflags  = -L.
# ...
LIBS = $(LIBRUBYARG_SHARED) -lstdc++  -ldl -lcrypt

# after
ldflags  = -L. -L/usr/local/lib
# ...
LIBS = $(LIBRUBYARG_SHARED) -lstdc++  -ldl -lcrypt -lmecab

これでビルド可能

MeCab-rubyロード時の留意点

require 'mecab' じゃなく require 'MeCab' な。

irb(main):001:0> require 'mecab'
LoadError: No such file or directory - /usr/lib/ruby/site_ruby/1.8/i386-cygwin/mecab.so
        from /usr/lib/ruby/site_ruby/1.8/i386-cygwin/mecab.so
        from (irb):1
irb(main):002:0> require 'MeCab'
=> true