[ruby-dev:38731] FreeBSD で ruby-mecab のライブラリ参照の不具合

View: New views
6 Messages — Rating Filter:   Alert me  

[ruby-dev:38731] FreeBSD で ruby-mecab のライブラリ参照の不具合

by Makoto Kishimoto :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

きしもとです

FreeBSD7.2 (RELENG_7) で、CVS から取ってきた ports を使っています。
Ruby のバージョンは
$ ruby --version
ruby 1.8.7 (2009-04-08 patchlevel 160) [amd64-freebsd7]
となっています。

ruby-mecab のビルドで、

[/usr/ports/japanese/ruby-mecab]$ make configure
===>   ja-ruby18-mecab-0.97 depends on file: /usr/local/bin/ruby18 - found
===>   ja-ruby18-mecab-0.97 depends on shared library: mecab.1 - found
===>  Configuring for ja-ruby18-mecab-0.97
===>  Running extconf.rb to configure
checking for main() in -lmecab... no
checking for main() in -lstdc++... yes
checking for mecab.h... yes
creating Makefile

と、MeCab のシェアードライブラリは入っているのですが、extconf.rb からは
見えておらず、ビルドは成功するのですが、mecab を使おうとすると、

$ ruby test.rb
0.97
/libexec/ld-elf.so.1: /usr/local/lib/ruby/site_ruby/1.8/amd64-freebsd7/MeCab.so: Undefined symbol "_ZN5MeCab12createTaggerEPKc"

のように、ダイナミックリンクに失敗します。LD_LIBRARY_PATH=/usr/local/lib を
付けてみましたが変化ありませんでした。

他の拡張モジュールでも起きるのかどうかわかりませんが、確認したところの報告まで。


[ruby-dev:38732] Re: FreeBSD で ruby-mecab のライブラリ参照の不具合

by Kouhei Sutou :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

須藤です。

In <20090704153002.d969dc66.ksmakoto@...>
  "[ruby-dev:38731] FreeBSD で ruby-mecab のライブラリ参照の不具合" on Sat, 4 Jul 2009 15:30:04 +0900,
  "KISHIMOTO, Makoto" <ksmakoto@...> wrote:

> FreeBSD7.2 (RELENG_7) で、CVS から取ってきた ports を使っています。
> Ruby のバージョンは
> $ ruby --version
> ruby 1.8.7 (2009-04-08 patchlevel 160) [amd64-freebsd7]
> となっています。

i386ですが、手元では動いているように見えます。
(test.rbの中身がわからないので試しかたが違うと思いますが。)

  % ruby -v
  ruby 1.8.7 (2009-04-08 patchlevel 160) [i386-freebsd7]

> $ ruby test.rb
> 0.97
> /libexec/ld-elf.so.1: /usr/local/lib/ruby/site_ruby/1.8/amd64-freebsd7/MeCab.so: Undefined symbol "_ZN5MeCab12createTaggerEPKc"
>
> のように、ダイナミックリンクに失敗します。LD_LIBRARY_PATH=/usr/local/lib を
> 付けてみましたが変化ありませんでした。

この結果はどうなりますか?

  % strings /usr/local/lib/ruby/site_ruby/1.8/amd64-freebsd7/MeCab.so | grep _ZN5MeCab
  % strings /usr/local/lib/libmecab.so.1 | grep _ZN5MeCab12
  % mecab-config --version


[ruby-dev:38733] Re: FreeBSD で ruby-mecab のライブラリ参照の不具合

by Makoto Kishimoto :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

test.rb は ruby-mecab の配布物の中の test.rb です

> この結果はどうなりますか?
>
>   % strings /usr/local/lib/ruby/site_ruby/1.8/amd64-freebsd7/MeCab.so | grep _ZN5MeCab
>   % strings /usr/local/lib/libmecab.so.1 | grep _ZN5MeCab12
>   % mecab-config --version

$ strings /usr/local/lib/ruby/site_ruby/1.8/amd64-freebsd7/MeCab.so | grep _ZN5MeCab
_ZN5MeCab6Tagger6createEiPPc
_ZN5MeCab6Tagger6createEPKc
_ZN5MeCab12createTaggerEPKc
_ZN5MeCab14getTaggerErrorEv
_ZN5MeCab6Tagger7versionEv

$ strings /usr/local/lib/libmecab.so.1 | grep _ZN5MeCab12
_ZN5MeCab12progress_barEPKcmm
_ZN5MeCab12CharPropertyD0Ev
_ZN5MeCab12CharProperty5closeEv
_ZN5MeCab12CharPropertyD1Ev
_ZN5MeCab12FeatureIndexD0Ev
_ZN5MeCab12StringBufferD1Ev
_ZN5MeCab12FeatureIndexD1Ev
_ZN5MeCab12FeatureIndexD2Ev
_ZN5MeCab12FeatureIndex19buildUnigramFeatureEP20mecab_learner_path_tPKc
_ZN5MeCab12FeatureIndex8calcCostEP20mecab_learner_node_t
_ZN5MeCab12FeatureIndex18buildBigramFeatureEP20mecab_learner_path_tPKcS4_
_ZN5MeCab12FeatureIndex8calcCostEP20mecab_learner_path_t
_ZN5MeCab12CharProperty4openERKNS_5ParamE
_ZN5MeCab12CharProperty11set_charsetEPKc
_ZN5MeCab12CharProperty7compileEPKcS2_S2_
_ZN5MeCab12StringBuffer5writeEPKcm
_ZN5MeCab12StringBuffer5writeEc
_ZN5MeCab12StringBuffer5writeEPKc
_ZN5MeCab12StringBufferD0Ev
_ZN5MeCab12StringBufferD2Ev
_ZN5MeCab12StringBuffer7reserveEm
_ZN5MeCab12scoped_arrayIN5Darts15DoubleArrayImplIchijNS1_6LengthIcEEE16result_pair_typeEED0Ev
_ZN5MeCab12scoped_arrayIN5Darts15DoubleArrayImplIchijNS1_6LengthIcEEE16result_pair_typeEED1Ev
_ZN5MeCab12scoped_arrayIcED0Ev
_ZN5MeCab12scoped_arrayIcED1Ev
_ZN5MeCab12CharProperty4openEPKc
_ZN5MeCab12createTaggerEPKc
_ZN5MeCab12createTaggerEiPPc
_ZN5MeCab12FeatureIndex9set_alphaEPKd
_ZN5MeCab12FeatureIndex6strdupEPKc
_ZN5MeCab12FeatureIndex8getIndexEPPcS2_m
_ZN5MeCab12FeatureIndex12openTemplateERKNS_5ParamE

$ mecab-config --version
0.97


[ruby-dev:38736] Re: FreeBSD で ruby-mecab のライブラリ参照の不具合

by seike-ml :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

せいけです。

# 環境も違いますし、とりあえず情報だけの提供です。

FreeBSD i386で今日MeCab関係はインスールしたのですが、
動いているようです。amd64の問題でしょうか?

インストールしたportsは以下です。
  ja-mecab-0.97
  ja-mecab-ipadic-2.7.0.20070801
  ja-ruby18-mecab-0.97


# uname -a
FreeBSD rx.seike.org 7.2-STABLE FreeBSD 7.2-STABLE #0: Sun Jul  5 02:58:46 JST 2009<省略>

# ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-freebsd7]

# nm /usr/local/lib/libmecab.so.1|grep _ZN5MeCab12create
0004f020 T _ZN5MeCab12createTaggerEPKc
0004f390 T _ZN5MeCab12createTaggerEiPPc

# nm /usr/local/lib/ruby/site_ruby/1.8/i386-freebsd7/MeCab.so |grep _ZN5MeCab12create
         U _ZN5MeCab12createTaggerEPKc

# ldd /usr/local/lib/ruby/site_ruby/1.8/i386-freebsd7/MeCab.so
/usr/local/lib/ruby/site_ruby/1.8/i386-freebsd7/MeCab.so:
        libruby18.so.18 => /usr/local/lib/libruby18.so.18 (0x28300000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x283db000)
        libmecab.so.1 => /usr/local/lib/libmecab.so.1 (0x284d0000)
        libcrypt.so.4 => /lib/libcrypt.so.4 (0x28199000)
        libm.so.5 => /lib/libm.so.5 (0x281b2000)
        libc.so.7 => /lib/libc.so.7 (0x28089000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x281c7000)
        libthr.so.3 => /lib/libthr.so.3 (0x281d2000)
        libiconv.so.3 => /usr/local/lib/libiconv.so.3 (0x28613000)

# ldd /usr/local/lib/libmecab.so.1
/usr/local/lib/libmecab.so.1:
        libiconv.so.3 => /usr/local/lib/libiconv.so.3 (0x28443000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x28538000)
        libm.so.5 => /lib/libm.so.5 (0x2818c000)
        libc.so.7 => /lib/libc.so.7 (0x28089000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x281a1000)

# ruby /usr/local/share/examples/ruby18/mecab/test.rb
0.97
...
filename: /usr/local/lib/mecab/dic/ipadic/sys.dic
charset: euc-jp
size: 392126
type: 0
lsize: 1316
rsize: 1316
version: 102


At Sat, 4 Jul 2009 20:26:51 +0900,
KISHIMOTO, Makoto wrote:
>
> test.rb は ruby-mecab の配布物の中の test.rb です
>
> > この結果はどうなりますか?
> >
> >   % strings /usr/local/lib/ruby/site_ruby/1.8/amd64-freebsd7/MeCab.so | grep _ZN5MeCab
> >   % strings /usr/local/lib/libmecab.so.1 | grep _ZN5MeCab12
> >   % mecab-config --version


[ruby-dev:38737] Re: FreeBSD で ruby-mecab のライブラリ参照の不具合

by Makoto Kishimoto :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

きしもとです

mkmf.log を見たところ、こんな感じでした。

have_library: checking for main() in -lmecab... -------------------- no

"cc -o conftest -I. -I/usr/local/lib/ruby/1.8/amd64-freebsd7 -I.    -O2 -fno-strict-aliasing -pipe  -fPIC   conftest.c  -L. -L/usr/local/lib -Wl,-R/usr/local/lib -L.  -rdynamic     -lruby18-static -lmecab  -lrt -lcrypt -lm  -rpath=/usr/lib:/usr/local/lib "
/usr/local/lib/libmecab.so: undefined reference to `pthread_create'
checked program was:
/* begin */
1: /*top*/
2: int main() { return 0; }
3: int t() { void ((*volatile p)()); p = (void ((*)()))main; return 0; }
/* end */

"cc -o conftest -I. -I/usr/local/lib/ruby/1.8/amd64-freebsd7 -I.    -O2 -fno-strict-aliasing -pipe  -fPIC   conftest.c  -L. -L/usr/local/lib -Wl,-R/usr/local/lib -L.  -rdynamic     -lruby18-static -lmecab  -lrt -lcrypt -lm  -rpath=/usr/lib:/usr/local/lib "
/usr/local/lib/libmecab.so: undefined reference to `pthread_create'
checked program was:
/* begin */
1: /*top*/
2: int main() { return 0; }
3: int t() { main(); return 0; }
/* end */

libmecab の pthread_create が解決できないのが原因のようです。
trunk から入れてある、ruby19 ではうまくいくので、それとおもわれる
相違点をさがしたところ、-lthr がコマンドラインにあるかどうかの差でした。

extconf.rb に

$LIBS = '-lthr ' + $LIBS

という行を追加してみたところ、うまく動くようになりました。
なぜ私の環境でだけ起きているのか謎ですが...


[ruby-dev:38739] Re: FreeBSD で ruby-mecab のライブラリ参照の不具合

by Makoto Kishimoto :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

きしもとです

ports の6月19日の変更以降でダメになっていることがわかりました。

追いかけてみた結果、

6月19日の ports/lang/ruby18/Makefile の変更↓で
http://www.freebsd.org/cgi/cvsweb.cgi/ports/lang/ruby18/Makefile.diff?r1=1.142;r2=1.143;f=h

LDFLAGS+=       ${PTHREAD_LIBS}

が削られていること(最新版にこの行を追加すれば動く)と

http://www.freebsd.org/cgi/cvsweb.cgi/ports/lang/ruby18/files/patch-configure.in?annotate=1.1

このパッチにより、Makefile 中で -lpthread が LIBS ではなく MAINLIBS に
設定されるようになっていること(そうならないようにパッチを修正すると動く)

以上(のどちらか・両方)が原因であると確認しました。
ruby の問題というよりは、ports の問題ですので、ruby-dev への報告は、
特に何かなければこれで最後にしたいと思います。