一、环境
操作系统: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本地根目录执行下面命令,耐心等待。
bjam install --toolset=msvc-12.0 --prefix="D:\Program Files\boost_1_58_0\install" --without-graph --without-python link=static runtime-link=shared threading=multi debug release |
https://jingyan.baidu.com/article/dca1fa6f768d76f1a4405289.html
三、导入文件
本文使用的leveldb源码下载地址:https://github.com/google/leveldb/tree/windows
1文件-》新建-》从现有代码文件创建新项目
打开 从现有代码文件创建新项目 向导窗口2要创建什么类型的项目? 选择Visual C++
这里源码文件在E:\0AA--master\leveldb-master目录中,所以使用的是E:\0AA--master\leveldb-maste
5使用Visual Studio 项目类型选择 静态库(LIB)项目
6 在设置"调试"配置的设置 中
预处理器定义 填写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
3配置属性-》C/C++-》常规-》预处理器-》预处理器定义
LEVELDB_PLATFORM_WINDOWS;OS_WIN
4链接器-》常规-》附加库目录 或者 库管理器-》附加库目录
E:\LIB\boost64\stage\lib
5排除文件
(手动从项目中排除所有的 *_test.cc 和*_bench.cc 文件,从项目里面移除所有 xxx_text.c c xxxx_bench.cc 测试和性能测试相关源文件。本文编译时没做括号中这部分)
排除其他平台的文件
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库加进去所以报错。
#include <assert> #include <iostream> #include <leveldb/db.h> int main (int argc,char * argv[]) { leveldb::DB* db; leveldb::Options options; options.create_if_missing = true; std::string dbpath = "testdb"; leveldb::Status status = leveldb::DB::Open (options, dbpath, &db); assert (status.ok ()); std::string key = "test"; std::string val = "test_value"; s = db->Put (leveldb::WriteOptions (), key, val); val.clear (); s = db->Get (leveldb::ReadOptions (), key, &val); std::cout << key << ": " << val << std::endl; } |
leveldb库功能详解:https://blog.csdn.net/cgongxi/article/details/79277450
一个简单的使用leveldb的例子:
-
-
-
-
-
-
-
using namespace std;
-
-
int main(void)
-
{
-
leveldb::DB *db;
-
leveldb::Options options;
-
options.create_if_missing = true;
-
-
// open
-
leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db);
-
assert(status.ok());
-
-
string key = "name";
-
string value = "chenqi";
-
-
// write
-
status = db->Put(leveldb::WriteOptions(), key, value);
-
assert(status.ok());
-
-
// read
-
status = db->Get(leveldb::ReadOptions(), key, &value);
-
assert(status.ok());
-
-
cout<<value<< endl;
-
-
// delete
-
status = db->Delete(leveldb::WriteOptions(), key);
-
assert(status.ok());
-
-
status = db->Get(leveldb::ReadOptions(),key, &value);
-
if(!status.ok()) {
-
cerr<<key<< " "<<status.ToString()<< endl;
-
} else {
-
cout<<key<< "==="<<value<< endl;
-
}
-
-
// close
-
delete db;
-
-
return 0;
-
}
-
-
-
-
-
//#include "leveldb/c.h"
-
-
using namespace std;
-
-
int main(void)
-
{
-
leveldb::DB *db;
-
leveldb::Options options;
-
options.create_if_missing = true;
-
-
// open
-
leveldb::Status status = leveldb::DB::Open(options, "./tmp/testdb", &db);
-
assert(status.ok());
-
-
string key = "t0";
-
string value = "1";
-
-
// write
-
status = db->Put(leveldb::WriteOptions(), key, value);
-
assert(status.ok());
-
status = db->Put(leveldb::WriteOptions(), "t1", "1");
-
assert(status.ok());
-
status = db->Put(leveldb::WriteOptions(), "t2", "2");
-
assert(status.ok());
-
status = db->Put(leveldb::WriteOptions(), "t3", "3");
-
assert(status.ok());
-
status = db->Put(leveldb::WriteOptions(), "t4", "4");
-
assert(status.ok());
-
status = db->Put(leveldb::WriteOptions(), "t5", "5");
-
assert(status.ok());
-
status = db->Put(leveldb::WriteOptions(), "t5", "6"); //key不能重复,否则值会被覆盖
-
assert(status.ok());
-
-
//read
-
leveldb::Iterator* it = db->NewIterator(leveldb::ReadOptions());
-
for (it->SeekToFirst(); it->Valid(); it->Next()) {
-
std:: cout << it->key().ToString() << ": " <<
-
it->value().ToString() << std:: endl;
-
}
-
assert(it->status().ok());
-
-
// close
-
delete db;
-
-
return 0;
-
}
-