$Id: libmecab.html,v 1.18 2004/06/21 09:34:35 taku-ku Exp $;
MeCabには, C/C++ 共用のライブラリ (mecab.h, libmecab.so/limecab.dll) があります.
C ライブラリは以下の関数を提供しています.
mecab_t *mecab_new (int argc, char **argv)mecab_t *mecab_new2 (char *arg)char *mecab_strerror (mecab_t* m)char *mecab_sparse_tostr (mecab_t *m, char
*str)char *mecab_sparse_tostr2 (mecab_t *m, char *str,
unsigned int len)char *mecab_sparse_tostr3 (mecab_t *m, char
*istr,unsigned int ilen char *ostr,unsigned int olen)char *mecab_nbest_sparse_tostr
    (mecab_t *m, unsigned int N, char *str)
    char *mecab_nbest_sparse_tostr2
    (mecab_t *m, unsigned int N, char *str, unsigned int len)
    char *mecab_nbest_sparse_tostr3
    (mecab_t *m, unsigned int N, char *str, unsigned int len, char
    *ostr, unsigned int olen)
    int mecab_nbest_init
(mecab_t* m, char* str);
int mecab_nbest_init2
(mecab_t* m, char* str, len);
    char *mecab_next_tostr
(mecab_t* m)
    char *mecab_next_tostr2
(mecab_t *m , char *ostr, unsigned int olen)
    int mecab_lock (mecab_t *m)int mecab_unlock (mecab_t *m)void mecab_destroy(mecab_t *m)
#include <mecab.h>
#include <stdio.h>
int main (int argc, char **argv) 
{
   mecab_t *c;
   char p[1024] = "太郎は次郎が持っている本を花子に渡した。";
   char *r;
   int i;
   c = mecab_new (argc, argv);
   if (c == NULL) {
      fprintf (stderr, "Exception:%s\n", mecab_strerror (c));
      return -1;
   }
   r = mecab_sparse_tostr(c, p);
   if (r == NULL) {
      fprintf (stderr, "Exception:%s\n", mecab_strerror (c));
      mecab_destroy(c);
      return -1;
   }
   printf ("INPUT: %s\n", p);
   printf ("RESULT:\n%s", r);
   r = mecab_nbest_sparse_tostr (c, 10, p);
   if (r == NULL) {
      fprintf (stderr, "Exception: [%s]\n", mecab_strerror (c));
      return -1;
   }
   fprintf (stdout, "NBEST: %s", r);
   if (! mecab_nbest_init (c, p)) {
      fprintf (stderr, "Exception: [%s]\n", mecab_strerror (c));
      return -1;
   };
   
   for (i = 0; i < 10; ++i) {
      printf ("%d: %s", i, mecab_nbest_next_tostr (c));
   }
   
   mecab_destroy(c);
   
   return 0;
}
% cc -O2 `mecab-config --cflags` example.c -o example \
         `mecab-config --libs`
まず, コンパイル作業を行うディレクトリに include\mecab.h,
bin\libmecab.dll lib\libmecab.lib をコピーします.
この後の作業は, 使用するコンパイラによって微妙に変わります.
cygwin/mingw 環境の場合
% gcc -DDLL_IMPORT -I. example.c -o example.exe libmecab.dll
Visual Studio .NET C++の場合
% cl -DDLL_IMPORT -I. example.c libmecab.lib
BCC32 環境の場合
インポートライブラリの作成 % implib.exe /a /f libmecab.lib libmecab.dll コンパイル % bcc32 -DDLL_IMPORT -I. example.c libmecab.lib
さらに, 以下例ように, libmecab.dll と動的
にリンクすることも可能です.
この場合は,
インポートライブラリを作成する必要はありません.
#include <stdio.h>
#include <windows.h>
typedef void* (WINAPI *FPINIT)  (int, char **);
typedef char* (WINAPI *FPERR)   (void*);
typedef char* (WINAPI *FPPARSE) (void*, char*);
typedef void  (WINAPI *FPDEL)   (void *);
int main (int argc, char **argv)
{
   char p[] = "太郎は次郎が持っている本を花子に渡した。";
   HINSTANCE hLib = LoadLibrary("libmecab.dll");
   
   if (hLib) {
      FPINIT  fpInit  = (FPINIT)  GetProcAddress(hLib, "mecab_new");
      FPERR   fpErr   = (FPERR)   GetProcAddress(hLib, "mecab_strerror");
      FPPARSE fpParse = (FPPARSE) GetProcAddress(hLib, "mecab_sparse_tostr");
      FPDEL   fpDel   = (FPDEL)   GetProcAddress(hLib, "mecab_destroy");
      
      if (fpInit && fpErr && fpParse && fpDel) {
         void *c = (void *)(*fpInit)(argc, argv);
         if (!c) {
            fprintf (stderr, "Exception %s\n", (*fpErr)(c));
            FreeLibrary(hLib);
            return -1;
         }
         
         printf ("INPUT: %s\n", p);
         printf ("RESULT:\n%s", (char *)(*fpParse)(c, p));
         (*fpDel)(c);
      }
      FreeLibrary(hLib);
   }
   return 0;
}
MeCab は, マルチスレッド環境で使用することが可能です. 使い方は, 以下の2つの方法があります.
1つのスレッドに 1インスタンスを割りあてる場合は, ユーザがとりたてて必要することはございません. 辞書は mmap (MapViewOfFile) を用いて, OS の仮想メモリ上に 割りあてられるため, 複数のインスタンスを作成しても, 多くのメモリを使用することは ありません.
この場合は, 同期をとる必要があります. configure option にて --enable-mutex を指定して make してください. ライブラリでは, mecab_lock にて 1つのスレッドが使用権を取得し, 解析後に mecab_unlock を使い使用権を 開放します. さらに, mecab_sparse_tostr () が返すメモリ領域は, 各インスタンスが管理し ています. そのため, unlock は, mecab_sparse_tostr () の結果を アプリケーション側で処理した 後に 行なう必要があります. ただし, mecab_sparse_tostr3 にて, バッファを指定した場合は その限りではありません.
マルチスレッド (pthread) の場合の例を example/example-thread.c example/example-thread2.c に示します.
$Id: libmecab.html,v 1.18 2004/06/21 09:34:35 taku-ku Exp $;
taku-ku@is.aist-nara.ac.jp