京都キャビネットをC++から使ってみようかと思ってみた。
http://fallabs.com/kyotocabinet/Windows用のバイナリパッケージはあるにはあるのだけれど、
リンク時にLNK4098が出そうだったので、
各種ランタイムに対応した形で、自分でビルドしてみた。
以下、手順メモです。
環境は、以下のような感じ。
Windows 7 64bit
Visual Studio (VC++) 2010
上記Webページから、
Source Packages of the core library (C/C++)
ってある場所のソースコードを落とします。
何となく現時点での最新版(1.2.33)にしてみました。
解凍すると、直下にVCmakefileがあります。
このまま
nmake /F VCmakefile
ってやっても(環境によっては)OKなのですが、
静的ライブラリを作成するため、
冒頭で書いたとおり、ランタイムのリンクが使う側のプロジェクトと本ライブラリとで一致していないと、おかしなことになり、リンカが警告を吐いてくれます。
そのため、各種ランタイムに対応したバージョンの静的ライブラリを作ってしまいましょう。
まず、VCmakefileを別名でコピーして、オリジナルを取っておきます。
VCmakefile.newという名前にしましょう。
VCmakefile.newをおもむろにテキストエディタで開きます。
(a)下記を自分の環境に合わせる必要がありそうです。特に、Windows 7 64bitの場合に必須です。(リンカエラーでlibcpmt.libがない、とか言われた場合は、ここのパスが間違っている可能性があります。)
(before)
VCPATH = C:\Program Files\Microsoft Visual Studio 10.0\VC
SDKPATH = C:\Program Files\Microsoft SDKs\Windows\v7.0A
(after(例))
VCPATH = C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC
SDKPATH = C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A
(b)CLFLAGSから/MTを除去します。
(before)
CLFLAGS = /nologo \
/I "$(VCPATH)\Include" /I "$(VCPATH)\PlatformSDK\Include" /I "$(SDKPATH)\Include" \
/I "." \
/DNDEBUG /D_CRT_SECURE_NO_WARNINGS \
/O2 /EHsc /W3 /wd4244 /wd4351 /wd4800 /MT
(after(例))
CLFLAGS = /nologo \
/I "$(VCPATH)\Include" /I "$(VCPATH)\PlatformSDK\Include" /I "$(SDKPATH)\Include" \
/I "." \
/DNDEBUG /D_CRT_SECURE_NO_WARNINGS \
/O2 /EHsc /W3 /wd4244 /wd4351 /wd4800
(c)再帰nmake用のファイル名、及びデフォルトコンパイルオプションを追加します。LINKFLAGSの下あたりが良いかと思います。
MAKEFILENAME = VCmakefile.new
ADDCLFLAGS = /MT
(d)Suffix rulesのコンパイル時のルール定義に、$(ADDCLFLAGS)を追加します。
(before)
.c.obj :
$(CL) /c $(CLFLAGS) $<
.cc.obj :
$(CL) /c $(CLFLAGS) $<
(after(例))
.c.obj :
$(CL) /c $(CLFLAGS) $(ADDCLFLAGS) $<
.cc.obj :
$(CL) /c $(CLFLAGS) $(ADDCLFLAGS) $<
(e)ライブラリをmakeするためのtargetを一つ追加します。
libs :
set ADDCLFLAGS=/MD
-del *.obj /F /Q > NUL: 2>&1
$(MAKE) /E /F $(MAKEFILENAME) $(LIBRARYFILES)
rename kyotocabinet.lib kyotocabinet-1-2-33-md.lib
set ADDCLFLAGS=/MDd
-del *.obj /F /Q > NUL: 2>&1
$(MAKE) /E /F $(MAKEFILENAME) $(LIBRARYFILES)
rename kyotocabinet.lib kyotocabinet-1-2-33-mdd.lib
set ADDCLFLAGS=/MT
-del *.obj /F /Q > NUL: 2>&1
$(MAKE) /E /F $(MAKEFILENAME) $(LIBRARYFILES)
rename kyotocabinet.lib kyotocabinet-1-2-33-mt.lib
set ADDCLFLAGS=/MTd
-del *.obj /F /Q > NUL: 2>&1
$(MAKE) /E /F $(MAKEFILENAME) $(LIBRARYFILES)
rename kyotocabinet.lib kyotocabinet-1-2-33-mtd.lib
set ADDCLFLAGS=
-del *.obj /F /Q > NUL: 2>&1
以上の編集を完了したら、VCmakefile.newを上書き保存します。
続いて、スタートメニューから「Visual Studio コマンドプロンプト (2010)」を探しだしてきて、起動します。要は、ビルド用にパスを通したコマンドプロンプトなのですけれども。
cd /d C:\path\to\kyotocabinet-1.2.33
で移動してから、以下のコマンドを順に叩きます。
(1) nmake /F VCmakefile.new libs
(2) nmake /F VCmakefile.new all
(3) nmake /F VCmakefile.new binpkg
(4) nmake /F VCmakefile.new check
kcwin32というフォルダが出来上がるので、
これらをVisual Studioから参照パスに追加すれば、使えるはずです。
因みに、(4)を軽い気持ちで始めたら、
延々1時間ぐらいかかった上に、エラーを吐きましたよ。
なんでーー??
PR