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を愛用
掲載日: 2011-06-05
iPentec all rights reserverd.