Kazuhiro Osawa
ko****@yappo*****
2005年 4月 19日 (火) 11:30:13 JST
大沢です。
FedoraCore3にて、Senna環境を構築をしてたのですがmecab-0.81.mte.patchを当てた
libmecab.soが正常に動作しませんでした。
gcc -vの結果は下記のとおりです。
gcc version 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)
下記のソースを
mecab.c------------------------------------------
#include <mecab.h>
int main () {
char *arg[] = {"", "-Owakati"};
mecab_load_dictionary(2, arg);
}
------------------------------------------
$ gcc -o mecab mecab.c -lmecab
して
$ gdb ./mecab
(gdb) run
としたら、下記のメッセージが表示され
------------------------------------------
Program received signal SIGSEGV, Segmentation fault.
0x006a325d in std::_Rb_tree<std::string, std::pair<std::string const, std::string>, std::_Select1st<std::pair<std::string const, std::string> >, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::insert_unique () from /usr/local/lib/libmecab.so.0
------------------------------------------
(gdb) bt
したら、下記のようになりました。
------------------------------------------
#0 0x006a325d in std::_Rb_tree<std::string, std::pair<std::string const, std::string>, std::_Select1st<std::pair<std::string const, std::string> >, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::insert_unique () from /usr/local/lib/libmecab.so.0
#1 0x0069eeb6 in MeCab::Param::setProfile () from /usr/local/lib/libmecab.so.0
#2 0x006a1c85 in MeCab::Param::open () from /usr/local/lib/libmecab.so.0
#3 0x006b508d in MeCab::SharedResource::open () from /usr/local/lib/libmecab.so.0
#4 0x006b8d15 in MeCab::SharedResourceOpen () from /usr/local/lib/libmecab.so.0
#5 0x006bf9ca in mecab_load_dictionary () from /usr/local/lib/libmecab.so.0
#6 0x0804849c in main ()
------------------------------------------
mecabのsrc/param.cppのconf変数に値を入れる時にエラーが出ているようなので
conf.clear()してみたり色々やっているうちに
mecab-0.81.mte.patchにpatchを当てる事で正常に動作するようになりました。
mecab-0.81.mte.patch.patch------------------------------------------
--- mecab-0.81.mte.patch 2005-04-11 10:19:25.000000000 +0900
+++ mecab-0.81.mte.patch.patch 2005-04-18 19:09:23.140384355 +0900
@@ -482,7 +482,7 @@
+
+ bool SharedResource::open(int argc, char** argv)
+ {
-+ if (opened) close();
++ opened = true;close();
+ if (! param.open (argc, argv, long_options)) {
+ return false;
+ }
------------------------------------------
正直STLには疎いので、この対処方で良いのかどうか分りませんが
応急処置という事で。。。
---
osawa