$Id: libmecab.html,v 1.14 2003/01/26 20:00:03 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)
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; c = mecab_new (argc, argv); if (c == NULL) { fprintf ("Exception:%s\n", mecab_strerror (c)); return -1; } r = mecab_sparse_tostr(c, p); if (r == NULL) { fprintf ("Exception:%s\n", mecab_strerror (c)); mecab_destroy(c); return -1; } printf ("INPUT: %s\n", p); printf ("RESULT:\n%s", r); 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 の仮想メモリ上に 割りあてられるため, 複数のインスタンスを作成しても, 多くのメモリを使用することは ありません.
この場合は, 同期をとる必要があります. 具体的には, mecab_lock にて 1つのスレッドが使用権を取得し, 解析後に mecab_unlock を使い使用権を 開放します.
マルチスレッド (pthread) の場合の例を example/example-thread.c example/example-thread2.c に示します.
$Id: libmecab.html,v 1.14 2003/01/26 20:00:03 taku-ku Exp $;
taku-ku@is.aist-nara.ac.jp