64ビットWindows用にMeCabをビルドする (Visual Studio 2015/2010を利用)
64ビットWindows用にMeCabをビルドします。
手順:mecab-0.996 + Visual Studio 2015
ソースコードの入手
MeCabのWebサイトからソースコードを入手します。今回は"mecab-0.996.tar.gz"を用います。
ファイルの展開
ソースコードのファイルを展開します。
Makefile.msvcの作成
ソースコードのsrcディレクトリにあるMakefile.msvc.inをコピーしてMakefile.msvcファイルにリネームします。
Makefile.msvcを以下の通りに修正します。
5行目
LDFLAGS = /nologo /OPT:REF /OPT:ICF /LTCG /NXCOMPAT /DYNAMICBASE /MACHINE:X64 ADVAPI32.LIB
/MACHINE:X86 を /MACHINE:X64 に変更します。
7行目~8行目
-DDLL_EXPORT -DHAVE_GETENV -DHAVE_WINDOWS_H -DDIC_VERSION=102 \
-DVERSION="\"0.996\"" -DPACKAGE="\"mecab\"" \
"-DDIC_VERSION", "-DVERSION"に実際のバージョン番号を入れます。
修正前(Makefile.msvc.in)
CC = cl.exe
CXXC = cl.exe
LINK=link.exe
CFLAGS = /EHsc /O2 /GL /GA /Ob2 /nologo /W3 /MT /Zi /wd4800 /wd4305 /wd4244
LDFLAGS = /nologo /OPT:REF /OPT:ICF /LTCG /NXCOMPAT /DYNAMICBASE /MACHINE:X86 ADVAPI32.LIB
DEFS = -D_CRT_SECURE_NO_DEPRECATE -DMECAB_USE_THREAD \
-DDLL_EXPORT -DHAVE_GETENV -DHAVE_WINDOWS_H -DDIC_VERSION=@DIC_VERSION@ \
-DVERSION="\"@VERSION@\"" -DPACKAGE="\"mecab\"" \
-DUNICODE -D_UNICODE \
-DMECAB_DEFAULT_RC="\"c:\\Program Files\\mecab\\etc\\mecabrc\""
INC = -I. -I..
DEL = del
OBJ = feature_index.obj param.obj learner.obj string_buffer.obj \
char_property.obj learner_tagger.obj tagger.obj \
connector.obj tokenizer.obj \
context_id.obj dictionary.obj utils.obj \
dictionary_compiler.obj viterbi.obj \
dictionary_generator.obj writer.obj iconv_utils.obj \
dictionary_rewriter.obj lbfgs.obj eval.obj nbest_generator.obj
.c.obj:
$(CC) $(CFLAGS) $(INC) $(DEFS) -c $<
.cpp.obj:
$(CC) $(CFLAGS) $(INC) $(DEFS) -c $<
all: libmecab mecab mecab-dict-index mecab-dict-gen mecab-cost-train mecab-system-eval mecab-test-gen
mecab: $(OBJ) mecab.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab.obj libmecab.lib
mecab-dict-index: $(OBJ) mecab-dict-index.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab-dict-index.obj libmecab.lib
mecab-dict-gen: $(OBJ) mecab-dict-gen.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab-dict-gen.obj libmecab.lib
mecab-cost-train: $(OBJ) mecab-cost-train.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab-cost-train.obj libmecab.lib
mecab-system-eval: $(OBJ) mecab-system-eval.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab-system-eval.obj libmecab.lib
mecab-test-gen: mecab-test-gen.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab-test-gen.obj libmecab.lib
libmecab: $(OBJ) libmecab.obj
$(LINK) $(LDFLAGS) /out:$@.dll $(OBJ) libmecab.obj /dll
clean:
$(DEL) *.exe *.obj *.dll *.a *.lib *.o *.exp *.def
修正後(Makefile.msvc)
CC = cl.exe
CXXC = cl.exe
LINK=link.exe
CFLAGS = /EHsc /O2 /GL /GA /Ob2 /nologo /W3 /MT /Zi /wd4800 /wd4305 /wd4244
LDFLAGS = /nologo /OPT:REF /OPT:ICF /LTCG /NXCOMPAT /DYNAMICBASE /MACHINE:X64 ADVAPI32.LIB
DEFS = -D_CRT_SECURE_NO_DEPRECATE -DMECAB_USE_THREAD \
-DDLL_EXPORT -DHAVE_GETENV -DHAVE_WINDOWS_H -DDIC_VERSION=102 \
-DVERSION="\"0.996\"" -DPACKAGE="\"mecab\"" \
-DUNICODE -D_UNICODE \
-DMECAB_DEFAULT_RC="\"c:\\Program Files\\mecab\\etc\\mecabrc\""
INC = -I. -I..
DEL = del
OBJ = feature_index.obj param.obj learner.obj string_buffer.obj \
char_property.obj learner_tagger.obj tagger.obj \
connector.obj tokenizer.obj \
context_id.obj dictionary.obj utils.obj \
dictionary_compiler.obj viterbi.obj \
dictionary_generator.obj writer.obj iconv_utils.obj \
dictionary_rewriter.obj lbfgs.obj eval.obj nbest_generator.obj
.c.obj:
$(CC) $(CFLAGS) $(INC) $(DEFS) -c $<
.cpp.obj:
$(CC) $(CFLAGS) $(INC) $(DEFS) -c $<
all: libmecab mecab mecab-dict-index mecab-dict-gen mecab-cost-train mecab-system-eval mecab-test-gen
mecab: $(OBJ) mecab.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab.obj libmecab.lib
mecab-dict-index: $(OBJ) mecab-dict-index.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab-dict-index.obj libmecab.lib
mecab-dict-gen: $(OBJ) mecab-dict-gen.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab-dict-gen.obj libmecab.lib
mecab-cost-train: $(OBJ) mecab-cost-train.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab-cost-train.obj libmecab.lib
mecab-system-eval: $(OBJ) mecab-system-eval.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab-system-eval.obj libmecab.lib
mecab-test-gen: mecab-test-gen.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab-test-gen.obj libmecab.lib
libmecab: $(OBJ) libmecab.obj
$(LINK) $(LDFLAGS) /out:$@.dll $(OBJ) libmecab.obj /dll
clean:
$(DEL) *.exe *.obj *.dll *.a *.lib *.o *.exp *.def
feature_index.cpp の修正
356行目
case 't': os_ << (size_t)path->rnode->char_type; break;
を
case 't': os_ << (unsigned int)path->rnode->char_type; break;
に変更します。
write.cpp の修正
260行目
case 'L': *os << lattice->size(); break;
を
case 'L': *os << (unsigned int)lattice->size(); break;
に変更します。
コンパイル
スタートメニューの[Visual Studio 2015]プログラムグループの[VS2015 Native Tools コマンドプロンプト]をクリックしてコマンドプロンプトを表示します。
MeCabのソースコードディレクトリのsrcディレクトリにカレントディレクトリを変更し、Make.batを実行します。
「データが失われているかもしれません」「デストラクターに値が戻りません。メモリ リークの可能性があります」ワーニングがたくさん表示されますが、コンパイル、リンクは通ります。
libmecab.dllがsrcディレクトリに生成されます。
手順:mecab-0.98 + Visual Studio 2010
ソースコードの入手
MeCabのWebサイトからソースコードを入手します。今回は"mecab-0.98.tar.gz"を用います。
ファイルの展開
ソースコードのファイルを展開します。
Makefile.msvcの作成
ソースコードのsrcディレクトリにあるMakefile.msvc.inをコピーしてMakefile.msvcファイルにリネームします。
Makefile.msvcを以下の通りに修正します。
5行目
LDFLAGS = /nologo /OPT:REF /OPT:ICF /LTCG /NXCOMPAT /DYNAMICBASE /MACHINE:X64 ADVAPI32.LIB
/MACHINE:X86 を /MACHINE:X64 に変更します。
7行目~8行目
-DDLL_EXPORT -DHAVE_GETENV -DHAVE_WINDOWS_H -DDIC_VERSION=102 \
-DVERSION="\"0.98\"" -DPACKAGE="\"mecab\"" \
"-DDIC_VERSION", "-DVERSION"に実際のバージョン番号を入れます。
修正前(Makefile.msvc.in)
CC = cl.exe
CXXC = cl.exe
LINK=link.exe
CFLAGS = /EHsc /O2 /GL /GA /Ob2 /nologo /W3 /MT /Zi /wd4800 /wd4305 /wd4244
LDFLAGS = /nologo /OPT:REF /OPT:ICF /LTCG /NXCOMPAT /DYNAMICBASE /MACHINE:X86 ADVAPI32.LIB
DEFS = -D_CRT_SECURE_NO_DEPRECATE -DMECAB_USE_THREAD \
-DDLL_EXPORT -DHAVE_GETENV -DHAVE_WINDOWS_H -DDIC_VERSION=@DIC_VERSION@ \
-DVERSION="\"@VERSION@\"" -DPACKAGE="\"mecab\"" \
-DMECAB_USE_MUTEX_LOCK \
-DMECAB_DEFAULT_RC="\"c:\\Program Files\\mecab\\etc\\mecabrc\""
INC = -I. -I..
DEL = del
OBJ = feature_index.obj param.obj learner.obj string_buffer.obj \
char_property.obj learner_tagger.obj tagger.obj \
connector.obj tokenizer.obj \
context_id.obj dictionary.obj utils.obj \
dictionary_compiler.obj viterbi.obj \
dictionary_generator.obj writer.obj iconv_utils.obj \
dictionary_rewriter.obj lbfgs.obj eval.obj nbest_generator.obj
.c.obj:
$(CC) $(CFLAGS) $(INC) $(DEFS) -c $<
.cpp.obj:
$(CC) $(CFLAGS) $(INC) $(DEFS) -c $<
all: libmecab mecab mecab-dict-index mecab-dict-gen mecab-cost-train mecab-system-eval mecab-test-gen
mecab: $(OBJ) mecab.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab.obj libmecab.lib
mecab-dict-index: $(OBJ) mecab-dict-index.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab-dict-index.obj libmecab.lib
mecab-dict-gen: $(OBJ) mecab-dict-gen.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab-dict-gen.obj libmecab.lib
mecab-cost-train: $(OBJ) mecab-cost-train.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab-cost-train.obj libmecab.lib
mecab-system-eval: $(OBJ) mecab-system-eval.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab-system-eval.obj libmecab.lib
mecab-test-gen: mecab-test-gen.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab-test-gen.obj libmecab.lib
libmecab: $(OBJ) libmecab.obj
$(LINK) $(LDFLAGS) /out:$@.dll $(OBJ) libmecab.obj /dll
clean:
$(DEL) *.exe *.obj *.dll *.a *.lib *.o *.exp *.def
修正後(Makefile.msvc)
CC = cl.exe
CXXC = cl.exe
LINK=link.exe
CFLAGS = /EHsc /O2 /GL /GA /Ob2 /nologo /W3 /MT /Zi /wd4800 /wd4305 /wd4244
LDFLAGS = /nologo /OPT:REF /OPT:ICF /LTCG /NXCOMPAT /DYNAMICBASE /MACHINE:X64 ADVAPI32.LIB
DEFS = -D_CRT_SECURE_NO_DEPRECATE -DMECAB_USE_THREAD \
-DDLL_EXPORT -DHAVE_GETENV -DHAVE_WINDOWS_H -DDIC_VERSION=102 \
-DVERSION="\"0.98\"" -DPACKAGE="\"mecab\"" \
-DMECAB_USE_MUTEX_LOCK \
-DMECAB_DEFAULT_RC="\"c:\\Program Files\\mecab\\etc\\mecabrc\""
INC = -I. -I..
DEL = del
OBJ = feature_index.obj param.obj learner.obj string_buffer.obj \
char_property.obj learner_tagger.obj tagger.obj \
connector.obj tokenizer.obj \
context_id.obj dictionary.obj utils.obj \
dictionary_compiler.obj viterbi.obj \
dictionary_generator.obj writer.obj iconv_utils.obj \
dictionary_rewriter.obj lbfgs.obj eval.obj nbest_generator.obj
.c.obj:
$(CC) $(CFLAGS) $(INC) $(DEFS) -c $<
.cpp.obj:
$(CC) $(CFLAGS) $(INC) $(DEFS) -c $<
all: libmecab mecab mecab-dict-index mecab-dict-gen mecab-cost-train mecab-system-eval mecab-test-gen
mecab: $(OBJ) mecab.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab.obj libmecab.lib
mecab-dict-index: $(OBJ) mecab-dict-index.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab-dict-index.obj libmecab.lib
mecab-dict-gen: $(OBJ) mecab-dict-gen.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab-dict-gen.obj libmecab.lib
mecab-cost-train: $(OBJ) mecab-cost-train.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab-cost-train.obj libmecab.lib
mecab-system-eval: $(OBJ) mecab-system-eval.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab-system-eval.obj libmecab.lib
mecab-test-gen: mecab-test-gen.obj
$(LINK) $(LDFLAGS) /out:$@.exe mecab-test-gen.obj libmecab.lib
libmecab: $(OBJ) libmecab.obj
$(LINK) $(LDFLAGS) /out:$@.dll $(OBJ) libmecab.obj /dll
clean:
$(DEL) *.exe *.obj *.dll *.a *.lib *.o *.exp *.def
common.h の修正
common.hの#include部分に次のコードを追加します。
#include <iterator>
feature_index.cpp の修正
311行目
case 't': os_ << (size_t)path->rnode->char_type; break;
を
case 't': os_ << (unsigned int)path->rnode->char_type; break;
に変更します。
write.cpp の修正
236行目
case 'L': *os << std::strlen(sentence); break;
を
case 'L': *os << (unsigned int)std::strlen(sentence); break;
に変更します。
mecab.h の修正
254行目
#ifndef SIWG
static Tagger* create(int argc, char **argv);
static Tagger* create(const char *arg);
#endif
を
#ifndef SWIG
static Tagger* create(int argc, char **argv);
static Tagger* create(const char *arg);
#endif
に変更します。ここはスペルミスのようです。
コンパイル
スタートメニューの[Microsoft Visual Studio 2010]メニューの[Visual Studio Tools]メニューの[Visual Studio x64 Win64 コマンド プロンプト (2010)]をクリックしてコマンドプロンプトを表示します。MeCabのソースコードディレクトリのsrcディレクトリにカレントディレクトリを変更し、Make.batを実行します。
「データが失われているかもしれません」「デストラクターに値が戻りません。メモリ リークの可能性があります」ワーニングがたくさん表示されますが、コンパイル、リンクは通りlibmecab.dllがsrcディレクトリに生成されます。
参考URL
http://chezou.wordpress.com/2010/10/13/mecab%e3%82%92ruby-1-9-2-on-windows764bit%e7%89%88%e3%81%a7%e4%bd%bf%e3%81%86%e6%96%b9%e6%b3%95/
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用