Windows下 VS2015编译levelDB(nmake)
VS2015编译levelDB
Leveldb是一个google实现的非常高效的kv数据库,非常适合嵌入到程序中。如果有简单的key-value数据库需求,而又想使用一个数据库服务的话,levelDB是非常合适的。(BerkeleyDB和forestdb也不错)。
本文不适用于VS2013及更低版本。
1、下载level源码
直接使用git克隆一个即可
git clone https://github.com/google/leveldb.git
2、切换到windows分支
进入leveldb目录,执行下面操作
git checkout origin/windows
现在的leveldb版本是1.19但是Windows版本为1.17。
3、源码修改
切换到windows分支后,还需要修改两处地方。
1、修改db/c.cc文件
打开db/c.cc文件,将第八行位置修改如下
#ifndef WIN32
#include <unistd.h>
#endif
2、修改port/port.h文件
在如下代码(17、18行)
#elif defined(LEVELDB_PLATFORM_ANDROID)
# include "port/port_android.h"
后面添加
#elif defined(LEVELDB_PLATFORM_WINDOWS)
# include "port/port_win.h"
3、修改port/port_win.h文件
将第四行的宏定义给注释掉
#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
3、添加Makefile.vc文件
直接拷贝下面的内容,在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)
4、编译
打开VS 2015 开发人员命令提示工具,切换到leveldb目录。
执行下面操作
nmake -f Makefile.vc
如果没包错误的话,编译完成后会在build目录下生成leveldb.lib文件。
因为leveldb没有使用__declspec(dllexport)导出接口,所以这里如果改为生成动态库,不会生成.lib文件。
Windows下 VS2015编译levelDB(nmake)的更多相关文章
- Windows下 VS2015编译RocksDB
VS2015编译RocksDB RocksDB 是一个来自 facebook 的可嵌入式的支持持久化的 key-value 存储系统,也可作为 C/S 模式下的存储数据库,但主要目的还是嵌入式.Roc ...
- Windows下 VS2015编译boost1.62
VS2015编译boost1.62 Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有 ...
- Windows下 VS2015编译ForestDB
VS2015编译ForestDB ForestDB 是一个快速的 Key-Value 存储引擎,基于层次B +树单词查找树.由 Couchbase 缓存和存储团队开发. 1.下载forestdb源码 ...
- Windows下PythonQt编译(vs2015+Qt5.11.2+PythonQt 3.2)
后记: 由于自己low,没有下载罪行的python3.2导致编译上遇到种种问题,后文可以参考,建议看: <Windows7 VS2015 下编译 PythonQt3.2> https:// ...
- Windows下PythonQt编译(vs2015+Qt5.11.2+PythonQt 3.2)探索
时间:2018年10月20日 笔者最近在做Qt方面的开发工作,需用到脚本程序对程序内部进行扩展,就很自然的想到了PythonQt,下面介绍PythonQt在Windows下的的安装编译心得,水平有限, ...
- 原创 C++应用程序在Windows下的编译、链接:第一部分 概述
本文是对C++应用程序在Windows下的编译.链接的深入理解和分析,文章的目录如下: 我们先看第一章概述部分. 1概述 1.1编译工具简介 cl.exe是windows平台下的编译器,link.ex ...
- 【FFmpeg】Windows下FFmpeg编译
由于FFmpeg是基于Linux开发的开源项目,源代码和Windows下最常见的Visual Studio提供的C/C++编译器不兼容,因此它不能使用MSVC++编译,需要在Windows下配置一个类 ...
- C++应用程序在Windows下的编译、链接(一)概述
C++应用程序在Windows下的编译.链接(一)概述 本文是对C++应用程序在Windows下的编译.链接的深入理解和分析,文章的目录如下: 我们先看第一章概述部分. 1概述 1.1编译工具简介 c ...
- ACE在windows下的编译及配置(VS2010)
ACE在windows下的编译及配置(VS2010) 分类: -[小西南]- 2013-08-06 16:17 2354人阅读 评论( ...
随机推荐
- php定时回调接口
http://www.dewen.org/search/q/php%E5%AE%9A%E6%97%B6%E8%B0%83%E7%94%A8%E5%AD%98%E5%82%A8%E8%BF%87%E7% ...
- DP思路
在这里记录一些在大神们的博客,以及自己做过的一些DP的神奇思路吧 1.2015/04 NEUQ 月赛 转自:http://zyfzyf.is-programmer.com/posts/89993.h ...
- C# 数组基础知识
数组的属性: 数组可以是一维.多维或交错的. 数值数组元素的默认值设置为零,而引用元素的默认值设置为 null. 交错数组是数组的数组,因此,它的元素是引用类型,初始化为 null. 数组的索引从零开 ...
- AndroidManifest.xml文件解析(转帖)
原帖地址:http://www.cnblogs.com/pilang/archive/2011/04/20/2022932.html 一.关于AndroidManifest.xml And ...
- libnids
一.简介 libnids的英文意思是 Network Intrusion Detect System library,即网络入侵监测系统函数库.它是在前面介绍的两种C函数接口库libnet和libpc ...
- 转:CRF++
CRF++使用小结 http://www.cnblogs.com/pangxiaodong/archive/2011/11/21/2256264.html 1. 简述 最近要应用CRF模型,进行序列 ...
- AdMaster技术副总裁谈Hadoop、营销数据、Python和挖掘平台
http://www.infoq.com/cn/news/2014/09/admaster-hadoop 卢亿雷是现任AdMaster技术副总裁,曾在联想研究院.百度基础架构部.Carbonite C ...
- 【Python】无须numpy,利用map函数与zip(*)函数对数组转置(转)
http://blog.csdn.net/yongh701/article/details/50283689 在Python的numpy中,对类似array=[[1,2,3],[4,5,6],[7,8 ...
- hadoop hue切换中文版
搭建了Hue之后发现只有英文的界面,非常不开心,于是百度谷歌了一大堆也没有发现可靠的办法,就自己上手了一把,亲测可行. 英文版: 中文版: hue切换使用中文版的方法如下: 1.修改配置文件 vi / ...
- AOP中Advice执行两遍的原因
在我的spring项目中,Aop的Advice执行了两边,就好像拦截了两遍一样. 原因是:切面应该切到接口的实现类上,而不是接口上