Leveldb是一個google實現的很是高效的kv數據庫,很是適合嵌入到程序中。若是有簡單的key-value數據庫需求,而又想使用一個數據庫服務的話,levelDB是很是合適的。(BerkeleyDB和forestdb也不錯)。android
本文不適用於VS2013及更低版本。git
直接使用git克隆一個便可github
git clone https://github.com/google/leveldb.git
進入leveldb目錄,執行下面操做shell
git checkout origin/windows
如今的leveldb
版本是1.19
可是Windows版本爲1.17
。數據庫
切換到windows分支後,還須要修改兩處地方。windows
一、修改db/c.cc
文件
打開db/c.cc
文件,將第八行位置修改以下多線程
#ifndef WIN32 #include <unistd.h> #endif
二、修改port/port.h
文件
在以下代碼(1七、18行)app
#elif defined(LEVELDB_PLATFORM_ANDROID) # include "port/port_android.h"
後面添加工具
#elif defined(LEVELDB_PLATFORM_WINDOWS) # include "port/port_win.h"
三、修改port/port_win.h
文件
將第四行的宏定義給註釋掉ui
#define snprintf _snprintf // 註釋掉此句
由於VS2015中已經實現了snprintf
的定義,因此不須要這個了。
若是不去掉,編譯的時候將出現如下錯誤。
cl -c -nologo -Zc:wchar_t -FS -Zc:strictStrings -Zc:throwingNew -Zi -MDd -GR -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577 -EHsc -DLEVELDB_PLATFORM_WINDOWS -DOS_WIN -DWIN32 -DWIN64 -DNDEBUG -D_CRT_SECURE_NO_WARNINGS -I. -I.\include -IC:\Boost\include\boost-1_62 -Fobuild\obj\ @C:\Users\o\AppData\Local\Temp\nm35AF.tmp port_win.cc C:\Program Files (x86)\Windows Kits\10\include\10.0.14393.0\ucrt\stdio.h(1925): warning C4005: 'snprintf': macro redefinition D:\work_code\DataServices\3rd\LevelDB\port/port_win.h(34): note: see previous definition of 'snprintf' C:\Program Files (x86)\Windows Kits\10\include\10.0.14393.0\ucrt\stdio.h(1927): fatal error C1189: #error: Macro definition of snprintf conflicts with Standard Library function declaration
直接拷貝下面的內容,在leveldb
目錄下建立Makefile.vc
文件,粘貼過去。
注意,須要修改下面INCPATH
和LIBS
兩處,須要修改成正確的boost
庫路徑。
下面的SOURCES
中的.\db\db_bench.cc
、.\util\testutil.cc
、.\util\win_logger.cc
以及OBJECTS
中的$(OBJECTS_DIR)\db_bench.obj
、$(OBJECTS_DIR)\testutil.obj
、$(OBJECTS_DIR)\win_logger.obj
其實是不須要的,能夠移除。可是放在這裏也沒有什麼關係,能夠留着。
若是須要啓用Snappy
壓縮,那麼還須要在DEFINES
處添加-DSNAPPY
,同時還須要在INCPATH
和LIBS
處指定libsnappy
的include
和庫文件路徑。
############################################################################# MAKEFILE = Makefile ####### 編譯器,工具和選項設置 CC = cl CXX = cl DEFINES = -DLEVELDB_PLATFORM_WINDOWS -DOS_WIN -DWIN32 -DWIN64 -DNDEBUG -D_CRT_SECURE_NO_WARNINGS # 若是須要編譯debug版本,只須要將上面的 -DNDEBUG 去掉便可 CXXFLAGS = -nologo -Zc:wchar_t -FS -Zc:strictStrings -Zc:throwingNew \ -Zi -MT -O2 -GR -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577 \ -EHsc $(DEFINES) # 若是須要編譯debug版本,能夠將上面的 -O2 去掉,-W3改成-W1 # -MT表示使用運行時庫的多線程靜態版本,能夠根據須要改成-MTd/-MD/-MDd INCPATH = -I. -I.\include -IC:\Boost\include\boost-1_62 LINKER = lib # 若是要生成dll,上面的改成 link LFLAGS = /NOLOGO /MACHINE:X64 # 若是要生成32位版本,上的X64改成X86 # 若是是生成dll,上面還應該添加 /DYNAMICBASE /NXCOMPAT /INCREMENTAL:NO /DLL /SUBSYSTEM:WINDOWS /MANIFEST:embed LIBS = /LIBPATH:C:\Boost\lib64-msvc-14.0 IDC = idc IDL = midl ZIP = zip -r -9 COPY = copy /y COPY_FILE = copy /y COPY_DIR = xcopy /s /q /y /i DEL_FILE = del DEL_DIR = rmdir MOVE = move CHK_DIR_EXISTS= if not exist MKDIR = mkdir INSTALL_FILE = copy /y INSTALL_PROGRAM = copy /y INSTALL_DIR = xcopy /s /q /y /i ####### 輸出目錄設置 OBJECTS_DIR = build\obj ####### 文件列表 SOURCES = .\db\builder.cc \ .\db\c.cc \ .\db\dbformat.cc \ .\db\db_bench.cc \ .\db\db_impl.cc \ .\db\db_iter.cc \ .\db\filename.cc \ .\db\log_reader.cc \ .\db\log_writer.cc \ .\db\memtable.cc \ .\db\repair.cc \ .\db\table_cache.cc \ .\db\version_edit.cc \ .\db\version_set.cc \ .\db\write_batch.cc \ .\port\port_win.cc \ .\table\block.cc \ .\table\block_builder.cc \ .\table\format.cc \ .\table\iterator.cc \ .\table\merger.cc \ .\table\table.cc \ .\table\table_builder.cc \ .\table\two_level_iterator.cc \ .\util\arena.cc \ .\util\cache.cc \ .\util\coding.cc \ .\util\comparator.cc \ .\util\crc32c.cc \ .\util\env.cc \ .\util\env_boost.cc \ .\util\hash.cc \ .\util\histogram.cc \ .\util\logging.cc \ .\util\options.cc \ .\util\status.cc \ .\util\testutil.cc \ .\util\win_logger.cc \ OBJECTS = $(OBJECTS_DIR)\builder.obj \ $(OBJECTS_DIR)\c.obj \ $(OBJECTS_DIR)\dbformat.obj \ $(OBJECTS_DIR)\db_bench.obj \ $(OBJECTS_DIR)\db_impl.obj \ $(OBJECTS_DIR)\db_iter.obj \ $(OBJECTS_DIR)\filename.obj \ $(OBJECTS_DIR)\log_reader.obj \ $(OBJECTS_DIR)\log_writer.obj \ $(OBJECTS_DIR)\memtable.obj \ $(OBJECTS_DIR)\repair.obj \ $(OBJECTS_DIR)\table_cache.obj \ $(OBJECTS_DIR)\version_edit.obj \ $(OBJECTS_DIR)\version_set.obj \ $(OBJECTS_DIR)\write_batch.obj \ $(OBJECTS_DIR)\port_win.obj \ $(OBJECTS_DIR)\block.obj \ $(OBJECTS_DIR)\block_builder.obj \ $(OBJECTS_DIR)\format.obj \ $(OBJECTS_DIR)\iterator.obj \ $(OBJECTS_DIR)\merger.obj \ $(OBJECTS_DIR)\table.obj \ $(OBJECTS_DIR)\table_builder.obj \ $(OBJECTS_DIR)\two_level_iterator.obj \ $(OBJECTS_DIR)\arena.obj \ $(OBJECTS_DIR)\cache.obj \ $(OBJECTS_DIR)\coding.obj \ $(OBJECTS_DIR)\comparator.obj \ $(OBJECTS_DIR)\crc32c.obj \ $(OBJECTS_DIR)\env.obj \ $(OBJECTS_DIR)\env_boost.obj \ $(OBJECTS_DIR)\hash.obj \ $(OBJECTS_DIR)\histogram.obj \ $(OBJECTS_DIR)\logging.obj \ $(OBJECTS_DIR)\options.obj \ $(OBJECTS_DIR)\status.obj \ $(OBJECTS_DIR)\testutil.obj \ $(OBJECTS_DIR)\win_logger.obj \ DESTDIR = build TARGET = leveldb.lib DESTDIR_TARGET = build\leveldb.lib ####### 隱式規則 .SUFFIXES: .c .cpp .cc .cxx ## util目錄 {.\util}.cc{build\obj\}.obj:: $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$(OBJECTS_DIR)\ @<< $< << ## table目錄 {.\table}.cc{build\obj\}.obj:: $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$(OBJECTS_DIR)\ @<< $< << ## port目錄 {.\port}.cc{build\obj\}.obj:: $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$(OBJECTS_DIR)\ @<< $< << ## doc目錄 {.\doc}.cc{build\obj\}.obj:: $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$(OBJECTS_DIR)\ @<< $< << ## helpers目錄 {.\helpers}.cc{build\obj\}.obj:: $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$(OBJECTS_DIR)\ @<< $< << ## db目錄 {.\db}.cc{build\obj\}.obj:: $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$(OBJECTS_DIR)\ @<< $< << ####### 構建規則 first: all all: $(DESTDIR_TARGET) $(DESTDIR_TARGET): $(OBJECTS) FORCE $(LINKER) $(LFLAGS) /OUT:$(DESTDIR_TARGET) @<< $(OBJECTS) $(LIBS) << clean: $(DEL_FILE) /q $(OBJECTS) $(DEL_FILE) /q $(DESTDIR_TARGET) $(DEL_DIR) /s /q $(DESTDIR) install: uninstall: check: first # 由於windows下的mkdir沒有-p參數,因此必須先判斷目錄是否存在 FORCE: if not exist $(DESTDIR) $(MKDIR) $(DESTDIR) if not exist $(OBJECTS_DIR) $(MKDIR) $(OBJECTS_DIR)
打開VS 2015 開發人員命令提示
工具,切換到leveldb
目錄。
執行下面操做
nmake -f Makefile.vc
若是沒包錯誤的話,編譯完成後會在build
目錄下生成leveldb.lib
文件。
由於leveldb
沒有使用__declspec(dllexport)
導出接口,因此這裏若是改成生成動態庫,不會生成.lib
文件。