一、环境
操作系统:windows x64 编译器:VS2012
https://blog.csdn.net/flyfish1986/article/details/46806893
二、准备下Boost
编译需要Boost库支持,因此先将Boost库编译为64位版本
1.下载好了Boost库,解压boost文件到本地目录(如D:\Program Files\boost_1_58_0\)
2.双击运行目录里的bootstrap.bat,会生成几个可执行文件,包括bjam.exe
3.cmd下切换到boost本地根目录执行下面命令,耐心等待。
https://jingyan.baidu.com/article/dca1fa6f768d76f1a4405289.html
三、导入文件
本文使用的leveldb源码下载地址:https://github.com/google/leveldb/tree/windows
1文件-》新建-》从现有代码文件创建新项目
打开 从现有代码文件创建新项目 向导窗口2要创建什么类型的项目? 选择Visual C++
这里源码文件在E:\LIB\leveldb-windows目录中,所以使用的是E:\LIB\leveldb-windows
4项目名称填写 LevelDB
5使用Visual Studio 项目类型选择 静态库(LIB)项目
如果静态库(LIB)项目没有导入成功,可以先选择Windows应用程序项目
预处理器定义 填写LEVELDB_PLATFORM_WINDOWS;OS_WIN
包括搜索路径 填写E:\LIB\leveldb-windows;E:\LIB\leveldb-windows\include
7完成导入
四、检查配置部分
1配置属性-》常规-》配置类型
静态库(.lib)
2.Boost库在E:\LIB\boost64目录下,在项目的属性页中 配置成64位平台
配置属性-》C/C++-》常规-》附加包含目录
E:\LIB\boost64;E:\LIB\leveldb-windows;E:\LIB\leveldb-windows\include
LEVELDB_PLATFORM_WINDOWS;OS_WIN
4链接器-》常规-》附加库目录 或者 库管理器-》附加库目录
E:\LIB\boost64\stage\lib
5排除文件
排除其他平台的文件
port/port_android.cc
port/port_posix.cc
util/env_posix.cc
如果存在其他平台也排除
五、修改源码的地方
1.db\c.cc文件中头文件unistd.h
unistd.h 是 C 和 C++ 程序设计语言中提供对 POSIX 操作系统 API 的访问功能的头文件的名称。是Unix Standard的缩写。
windows下不支持.直接注释即可
2.port\port.h文件中
注明使用的是windows系统
在预编译中增加
#elif defined(LEVELDB_PLATFORM_WINDOWS)
#include "port/port_win.h"
注意添加的位置。
六、编译生成64位的lib
编译过程中遇到的问题:
1.无法打开包括文件:“sys/mman.h”: No such file ordirectory
第一次编译出现这个问题,第二次重新导入工程重做的时候没有出现这个问题。可能是因为第一次没有排除port/port_posix.cc文件。
2.无法打开包括文件:“pthread.h”: No such file or directory
下载最新版本pthreads-w32-2-9-1,下载后解压,可以看到共有三个文件夹,用到的主要是“Pre-built.2”这个文件夹下的三个文件夹,分别是动态链接库、头文件、静态链接库;然后配置头文件及静态链接库,配置动态链接库。
https://blog.csdn.net/qianchenglenger/article/details/16907821
3.无法打开包括文件:“sqlite3.h”: No such file or directory
下载sqlite3.h,并在配置中包含进去
https://www.cnblogs.com/superbi/p/4980127.html
4.无法打开包括文件:“kcpolydb.h”: No such file or directory
http://fallabs.com/kyotocabinet/winpkg/
下载kcpolydb.h,并在配置时包含进去
5.无法打开包括文件:“endian.h”: Nosuch file or directory
endian.h是Linux下编译涉及的头文件,在Windows中编译,不需要此头文件。
6.VS2012:"snprintf"找不到标识符
https://blog.csdn.net/shhdgl/article/details/41900045
snprintf()函数的格式跟printf差不多一样,是在c里面用的函数,包含在 #include <stdio.h>头文件中。
但snprintf()函数并不是标准c/c++中规定的函数,所以在许多编译器中,厂商提供了其相应的实现的版本。在gcc中,该函数名称就snprintf(),而在VS中称为_snprintf。 所以在需要使用snprintf()时改成_snprintf就可以了,或者在预编译处加入:
#if _MSC_VER #define snprintf _snprintf #endif |
7. dirent.h可以在windows下用吗
下载dirent-master,把头文件包括进去
七、windows下使用LevelDB
https://blog.csdn.net/flyfish1986/article/details/48651713?locationNum=2&fps=1
1.debug下的关于LevelDB配置
配置属性-》C/C++-》常规-》附加包含目录
LevelDB源代码的include目录
E:\LIB\leveldb-windows\include
配置属性-》链接器-》常规-》附加库目录
LevelDB.lib的生成目录
E:\LIB\leveldb-windows\x64\Debug
配置属性-》链接器-》输入-》附加依赖项
LevelDB.lib
问题:链接器附加依赖项不成功问题,如下界面,直接输入在附加依赖项弹出对话框中即可(图中标红部分)
选中你要修改的项目->属性,选择链接器,选择“输入”;选择附加依赖项,并单击后侧下拉式三角,选择编辑按钮;把自己需要的lib库加进来了,然后点击确认,设置完成
问题2:无法打开文件“libboost_date_time-vc110-mt-gd-1_58.lib”?
配置问题,没有把boost的lib库加进去所以报错。