2007年7月10日火曜日

mecab-python on windowsの問題

mingwでコンパイルした、mecabmecab-pythonが、うまくロードできないことがある。
だめなときは、ImportError: DLL load failed: メモリ ロケーションへのアクセスが無効です。とか言われる。

idle、PyScripter, IPythonからだと確実にロードできない。
MeCabLibでもだめだったから、libmecab-1.dllが原因かな。何が悪いんだろう。
バイナリ配布のmecab-win32だと、g++で作ったのとリンクできないし、VC++で試すしかないのかな。

ついでに、mingwだと、mecabをコンパイルするときに、mecab.hをいじっておくか、
MeCab_wrap.cxxをいじらないと、リンクに失敗した。
mecab.hをいじるなら、以下のdiff。

--- mecab.h     2007-03-11 23:19:42 +0900
+++ mecab-0.96/src/mecab.h      2007-07-10 09:58:10 +0900
@@ -217,11 +217,11 @@
     virtual ~Tagger() {}
 
 #ifndef SIWG
-    static Tagger* create(int argc, char **argv);
-    static Tagger* create(const char *arg);
+    MECAB_DLL_EXTERN static Tagger* create(int argc, char **argv);
+    MECAB_DLL_EXTERN static Tagger* create(const char *arg);
 #endif
 
-    static const char *version();
+    MECAB_DLL_EXTERN static const char *version();
   };
 
   /* factory method */

MeCab_wrap.cxxはこっち

--- MeCab_wrap.cxx      2007-06-10 23:32:44 +0900
+++ mecab-python-0.96/MeCab_wrap.cxx    2007-07-10 12:44:27 +0900
@@ -4450,7 +4450,7 @@
   arg2 = reinterpret_cast< char ** >(argp2);
   {
     try {
-      result = (MeCab::Tagger *)MeCab::Tagger::create(arg1,arg2);
+      result = (MeCab::Tagger *)MeCab::createTagger(arg1,arg2);
     }
     catch (char *e) {
       SWIG_exception (SWIG_RuntimeError, e);
@@ -4483,7 +4483,7 @@
   arg1 = reinterpret_cast< char * >(buf1);
   {
     try {
-      result = (MeCab::Tagger *)MeCab::Tagger::create((char const *)arg1);
+      result = (MeCab::Tagger *)MeCab::createTagger((char const *)arg1);
     }
     catch (char *e) {
       SWIG_exception (SWIG_RuntimeError, e);
@@ -4548,7 +4548,7 @@
   if (!PyArg_ParseTuple(args,(char *)":Tagger_version")) SWIG_fail;
   {
     try {
-      result = (char *)MeCab::Tagger::version();
+      result = (char *)mecab_version();
     }
     catch (char *e) {
       SWIG_exception (SWIG_RuntimeError, e);




0 件のコメント:

コメントを投稿