Yasuhiro KIMURA
yasu****@utahi*****
2013年 2月 18日 (月) 20:59:25 JST
木村と申します。 FreeBSDのMeCab関連のportsを最新にしようとしているのですが、 mecab-ruby 0.996で以下のような問題が発生しました。 1. ruby 1.8との組み合わせでコンパイルエラー発生 ruby 1.8.7-p371とMeCab 0.996をインストールした状態でmecab-ruby 0.996を コンパイルすると、以下のようなエラーが発生します。 c++ -I. -I. -I/usr/local/lib/ruby/1.8/i386-freebsd9 -I. -DHAVE_MECAB_H -I/usr/local/include -I/usr/include -I/usr/include -fPIC -fwrapv -I/usr/include -O2 -pipe -fno-strict-aliasing -std=gnu89 -fPIC -I/usr/local/include -c MeCab_wrap.cpp cc1plus: warning: command line option "-std=gnu89" is valid for C/ObjC but not for C++ MeCab_wrap.cpp:1859:26: error: ruby/version.h: No such file or directory *** [MeCab_wrap.o] Error code 1 調べて見たところ、1.8と1.9では以下のような違いがあるようです。 * version.hの存在する場所が違う。 - 1.8は/usr/local/lib/ruby/1.8/${ARCH}-${OS}/version.h - 1.9は/usr/local/include/ruby-1.9/ruby/version.h →1.8では#include "version.h"、1.9では#include "ruby/encoding.h"とす る必要がある? * 1.8のversion.hではRUBY_API_VERSION_CODEは定義されていない。 →#if defined(RUBY_API_VERSION_CODE) && RUBY_API_VERSION_CODE >= 10900 とする必要がある? 2. ruby 1.9との組み合わせでMeCab.soにUndefined symbol発生 ruby 1.9.3-p385とMeCab 0.996をインストールした状態ではmecab-ruby 0.996 はコンパイル出来るのですが、インストール後にmecab-rubyを利用するrubyプ ログラムを動かすと、以下のようなUndefined symbolのエラーが発生します。 yasu @ freebsd[53]% bsfilter /usr/local/lib/ruby/site_ruby/1.9/i386-freebsd9/MeCab.so: Undefined symbol "_ZN5MeCab12createTaggerEPKc" yasu @ freebsd[54]% 原因を調べてみたのですが、まず何故かMeCab.soにlibmecabがリンクされてい ません。 yasu @ freebsd[57]% ldd /usr/local/lib/ruby/site_ruby/1.9/i386-freebsd9/MeCab.so /usr/local/lib/ruby/site_ruby/1.9/i386-freebsd9/MeCab.so: libruby19.so.19 => /usr/local/lib/libruby19.so.19 (0x281ba000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x28800000) libexecinfo.so.1 => /usr/local/lib/libexecinfo.so.1 (0x2838d000) libthr.so.3 => /lib/libthr.so.3 (0x28398000) libcrypt.so.5 => /lib/libcrypt.so.5 (0x283b8000) libm.so.5 => /lib/libm.so.5 (0x283dd000) libc.so.7 => /lib/libc.so.7 (0x2806c000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x288f5000) yasu @ freebsd[58]% そこでmecab-rubyをインストールした際のmkmf.logを見たところ、libmecabの 検出チェックのところで以下のようなリンクエラーが発生していました。 "cc -o conftest -I/usr/local/include/ruby-1.9//i386-freebsd9 -I/usr/local/include/ruby-1.9//ruby/backward -I/usr/local/include/ruby-1.9/ -I. -I/usr/local/include -I/usr/local/include -O2 -pipe -fno-strict-aliasing -fPIC conftest.c -L. -L/usr/local/lib -Wl,-R/usr/local/lib -L/usr/local/lib -Wl,-R/usr/local/lib -L. -Wl,-rpath=/usr/lib:/usr/local/lib -pthread -L/usr/local/lib -rdynamic -Wl,-R -Wl,/usr/local/lib -L/usr/local/lib -lruby19 -lmecab -lexecinfo -lpthread -lcrypt -lm -L/usr/local/lib -Wl,-rpath=/usr/lib:/usr/local/lib -pthread -lc" /usr/local/lib/libmecab.so: undefined reference to `libiconv' /usr/local/lib/libmecab.so: undefined reference to `libiconv_close' /usr/local/lib/libmecab.so: undefined reference to `libiconv_open' checked program was: /* begin */ 1: #include "ruby.h" 2: 3: /*top*/ 4: int main() {return 0;} 5: int t() { main(); return 0; } /* end */ そこで更に確認したところ、以下のようにmecabにはlibiconvがリンクされてい ますが、libmecabにはlibiconvがリンクされていません。 yasu @ freebsd[63]% ldd /usr/local/bin/mecab /usr/local/bin/mecab: libiconv.so.3 => /usr/local/lib/libiconv.so.3 (0x28069000) libmecab.so.2 => /usr/local/lib/libmecab.so.2 (0x28164000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x2830c000) libm.so.5 => /lib/libm.so.5 (0x28401000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x2841b000) libthr.so.3 => /lib/libthr.so.3 (0x28426000) libc.so.7 => /lib/libc.so.7 (0x28446000) yasu @ freebsd[64]% ldd /usr/local/lib/libmecab.so.2 /usr/local/lib/libmecab.so.2: libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x28800000) libm.so.5 => /lib/libm.so.5 (0x2834f000) libc.so.7 => /lib/libc.so.7 (0x2806c000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x28369000) yasu @ freebsd[65]% おそらくlibmecabを作成する際にlibiconvがリンクされてないのではと思われ ます。 上記2点、前者はmecab-rubyにおけるversion.hの使い方の問題、後者はMeCab 本体のMakefileの問題ではと推察しました。お手数ですがご対応を頂けますで しょうか。もし情報が不足しているですとか、あるいはそれはOSなどMeCab以 外の問題であるということでしたら、その旨ご指摘ください。 よろしくお願いします。 P.S. https://code.google.com/p/mecab/downloads/listから0.995のアーカイ ブ一式がいつの間にか無くなっていますが、何か問題があって取り下げ られたのでしょうか? 0.995では↑の2の問題は発生しないようだったの ですが。 --- 木村 康浩