[mecab-users 467] mecab-ruby 0.996でコンパイルエラーとUndefined symbol発生

Zurück zum Archiv-Index

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の問題は発生しないようだったの
     ですが。

---
木村 康浩




mecab-users メーリングリストの案内
Zurück zum Archiv-Index