« 今年もネジネジ | トップページ | 湿地 »

久々に MeCab.so を作ろうとしたらいろいろ大変だった(at Windows)

 しばらくぶりに MeCab を使ってみたら Ruby のバージョンが違うので使えなくなっていた。当事は 2.0.0 だった。ということであらたに作り直しをと作業する。MSYS とか Visual Studio 2013 Express をいれたりしてみたものの、どうもよろしくないので結局 Visual Studio 2010 Express で C++ をインストール。以前と同じ。

 MeCab のほうはバージョンアップがこのところないので同じ 0.996 。ということで、extconf.rb のライブラリパスあたりの修正は以前の通りに(というかファイルをそのまま流用)。Makefile は問題なく作られたので(2013 のコンソールでやったらなぜ作成に失敗したりしたのだった)、nmake を実行。

 ところがまずは、mecab.h ファイルが見つからないといわれてしまう。環境変数にパスを指定するという手はあるとあとで知ったのだけれど、ひとまず/sdk から必要なファイルをコピーしてきて同じフォルダに置いた。

 ふたたび nmake すると今度はなにやら違うエラーがでる。

MeCab_wrap.cpp(4373) : error C2039: 'set_result' : 'MeCab::Lattice' のメンバーで はありません。 mecab.h(778) : 'MeCab::Lattice' の宣言 を確認してください。

 mecab.h ファイルを見ると、たしかに Lattice の宣言に当該する set_result というのはない。ということで、その分を追加すればいけるという情報をウェブで見つけたのでその通りにしてみる。

[ Windowsにmecab-pythonを導入 - 個人的まとめ ]

class MECAB_DLL_CLASS_EXTERN Lattice の中に、

virtual void set_result(const char *str) = 0;

の一行を追加する。

 Ruby ではなく Python ではあるものの、この追加で nmake が通るようにはなった。無事に MeCab.so が生成される。(これも以前 Ruby-2.0.0 のときには問題なかったはずなのだが)

 付属している test.rb を実行すると確かに動作はしているようなのだけれど、少しおかしなことにはなる。まずは表示が文字化けしている。が、考えて見ると test.rb は UTF-8 になっているので SJIS に直すと問題なくなる。

 むしろ問題はそのあとで、test.rb では MeCab::Lattice を使うところになって Ruby がバグだといっているらしいメッセージをはじめて目にした。

test.rb:24: [BUG] vm_call_cfunc - cfp consistency error ruby 2.2.0p0 (2014-12-25 revision 49005) [i386-mswin32_100]

-- Control frame information -----------------------------------------------
c:0003 p:---- s:0018 e:000017 CFUNC :set_sentence
c:0002 p:0166 s:0014 E:000e14 EVAL test.rb:24 [FINISH]
c:0001 p:0000 s:0002 E:0020d4 TOP [FINISH]

-- Ruby level backtrace information ----------------------------------------
test.rb:24:in `

'
test.rb:24:in `set_sentence'

-- C level backtrace information -------------------------------------------
C:\Windows\SysWOW64\ntdll.dll(ZwWaitForSingleObject+0x15) [0x77D5F91D]
C:\Windows\syswow64\kernel32.dll(WaitForSingleObjectEx+0x43) [0x76F61194]
C:\Windows\syswow64\kernel32.dll(WaitForSingleObject+0x12) [0x76F61148]
c:\PROGRA~2\Ruby-2.2\bin\msvcr100-ruby220.dll(rb_print_backtrace+0x2f) [0x610534
73]
c:\PROGRA~2\Ruby-2.2\bin\msvcr100-ruby220.dll(rb_vm_bugreport+0x64) [0x610534D9]

c:\PROGRA~2\Ruby-2.2\bin\msvcr100-ruby220.dll(rb_bug+0x3f) [0x60FD87D1]
c:\PROGRA~2\Ruby-2.2\bin\msvcr100-ruby220.dll(rb_ruby_debug_ptr+0x5de) [0x60FBCF
83]
c:\PROGRA~2\Ruby-2.2\bin\msvcr100-ruby220.dll(rb_ruby_debug_ptr+0x671) [0x60FBD0
16]
c:\PROGRA~2\Ruby-2.2\bin\msvcr100-ruby220.dll(rb_vm_make_proc+0x928) [0x60FBFC31
]
c:\PROGRA~2\Ruby-2.2\bin\msvcr100-ruby220.dll(rb_equal_opt+0xb38) [0x60FC0CE0]
c:\PROGRA~2\Ruby-2.2\bin\msvcr100-ruby220.dll(rb_catch+0x533) [0x60FC290D]
c:\PROGRA~2\Ruby-2.2\bin\msvcr100-ruby220.dll(rb_iseq_eval_main+0x64) [0x60FC2CB
2]
c:\PROGRA~2\Ruby-2.2\bin\msvcr100-ruby220.dll(ruby_setup+0x180) [0x60F914BA]
c:\PROGRA~2\Ruby-2.2\bin\msvcr100-ruby220.dll(ruby_exec_node+0x14) [0x60F9155B]
c:\PROGRA~2\Ruby-2.2\bin\msvcr100-ruby220.dll(ruby_run_node+0x29) [0x60F9355D]
[0x01391030]
[0x013911C1]
C:\Windows\syswow64\kernel32.dll(BaseThreadInitThunk+0x12) [0x76F6337A]
C:\Windows\SysWOW64\ntdll.dll(RtlInitializeExceptionChain+0x63) [0x77D792E2]

-- Other runtime information -----------------------------------------------

* Loaded script: test.rb

* Loaded features:

0 enumerator.so
1 rational.so
2 complex.so
3 c:/PROGRA~2/Ruby-2.2/lib/ruby/2.2.0/i386-mswin32_100/enc/encdb.so
4 c:/PROGRA~2/Ruby-2.2/lib/ruby/2.2.0/i386-mswin32_100/enc/trans/transdb.so
5 c:/PROGRA~2/Ruby-2.2/lib/ruby/2.2.0/i386-mswin32_100/enc/windows_31j.so
6 c:/PROGRA~2/Ruby-2.2/lib/ruby/2.2.0/unicode_normalize.rb
7 c:/PROGRA~2/Ruby-2.2/lib/ruby/2.2.0/i386-mswin32_100/rbconfig.rb
8 thread.rb
9 c:/PROGRA~2/Ruby-2.2/lib/ruby/2.2.0/i386-mswin32_100/thread.so
10 c:/PROGRA~2/Ruby-2.2/lib/ruby/2.2.0/rubygems/compatibility.rb
11 c:/PROGRA~2/Ruby-2.2/lib/ruby/2.2.0/rubygems/defaults.rb
12 c:/PROGRA~2/Ruby-2.2/lib/ruby/2.2.0/rubygems/deprecate.rb
13 c:/PROGRA~2/Ruby-2.2/lib/ruby/2.2.0/rubygems/errors.rb
14 c:/PROGRA~2/Ruby-2.2/lib/ruby/2.2.0/rubygems/version.rb
15 c:/PROGRA~2/Ruby-2.2/lib/ruby/2.2.0/rubygems/requirement.rb
16 c:/PROGRA~2/Ruby-2.2/lib/ruby/2.2.0/rubygems/platform.rb
17 c:/PROGRA~2/Ruby-2.2/lib/ruby/2.2.0/rubygems/basic_specification.rb
18 c:/PROGRA~2/Ruby-2.2/lib/ruby/2.2.0/rubygems/stub_specification.rb
19 c:/PROGRA~2/Ruby-2.2/lib/ruby/2.2.0/rubygems/util/stringio.rb
20 c:/PROGRA~2/Ruby-2.2/lib/ruby/2.2.0/rubygems/specification.rb
21 c:/PROGRA~2/Ruby-2.2/lib/ruby/2.2.0/rubygems/exceptions.rb
22 c:/PROGRA~2/Ruby-2.2/lib/ruby/2.2.0/rubygems/core_ext/kernel_gem.rb
23 c:/PROGRA~2/Ruby-2.2/lib/ruby/2.2.0/monitor.rb
24 c:/PROGRA~2/Ruby-2.2/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb
25 c:/PROGRA~2/Ruby-2.2/lib/ruby/2.2.0/rubygems.rb
26 c:/PROGRA~2/Ruby-2.2/lib/ruby/site_ruby/2.2.0/i386-msvcr100/MeCab.so
27 c:/PROGRA~2/Ruby-2.2/lib/ruby/2.2.0/i386-mswin32_100/enc/trans/japanese_sj
is.so

[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: http://www.ruby-lang.org/bugreport.html

 よくわからないが Lattice.set_sentence() のところでなにやらおかしなことになるらしい。MeCab::Lattice を使わなければ問題はない様子。これは、やはり Ruby 側の問題なのか? 確かに Ruby-2.0.0 のときにはこうした問題は起きていなかった。

 あまり細かいことをしたいわけではないので現状でも使えるだろうとは思うのだけれど。ためしに Natto を使ってみる予定でもある。それはまた次回にメモする。

追記(7/8):
 nmake のときに例外処理で警告がでるようになったのも以前と違う。ただ、これはとりあえずそのままでも通ることは通るみたいではある。

|

« 今年もネジネジ | トップページ | 湿地 »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: 久々に MeCab.so を作ろうとしたらいろいろ大変だった(at Windows):

» Natto で MeCab を試す [つらつらぐさ]
 以前にも MeCab を使うのに Natto というのがあると見た覚えはあるのだけれど、使うのは今回がはじめて。どうやら MeCab のバ [続きを読む]

受信: 2015.07.09 15:18

» Natto と Ruby バインディングの使用感 [つらつらぐさ]
 コードを比べると Natto のほうが楽に書けるのかもしれない。  Natto を使うと、 require 'natto' sentenc [続きを読む]

受信: 2015.07.10 15:06

« 今年もネジネジ | トップページ | 湿地 »