windows下编译leveldb(已经验证)

一、环境

操作系统: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++


3项目文件位置 选择源码所在位置leveldb-windows文件夹所在位置 

这里源码文件在E:\0AA--master\leveldb-master目录中,所以使用的是E:\0AA--master\leveldb-maste


4项目名称填写 LevelDB

5使用Visual Studio 项目类型选择 静态库(LIB)项目


如果静态库(LIB)项目没有导入成功,可以先选择Windows应用程序项目
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的例子:

  1. #include <iostream>
  2. #include <string>
  3. #include <assert.h>
  4. #include "leveldb/db.h"
  5. #include "leveldb/c.h"
  6. using namespace std;
  7. int main(void)
  8. {
  9. leveldb::DB *db;
  10. leveldb::Options options;
  11. options.create_if_missing = true;
  12. // open
  13. leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db);
  14. assert(status.ok());
  15. string key = "name";
  16. string value = "chenqi";
  17. // write
  18. status = db->Put(leveldb::WriteOptions(), key, value);
  19. assert(status.ok());
  20. // read
  21. status = db->Get(leveldb::ReadOptions(), key, &value);
  22. assert(status.ok());
  23. cout<<value<< endl;
  24. // delete
  25. status = db->Delete(leveldb::WriteOptions(), key);
  26. assert(status.ok());
  27. status = db->Get(leveldb::ReadOptions(),key, &value);
  28. if(!status.ok()) {
  29. cerr<<key<< " "<<status.ToString()<< endl;
  30. } else {
  31. cout<<key<< "==="<<value<< endl;
  32. }
  33. // close
  34. delete db;
  35. return 0;
  36. }
  1. #include <iostream>
  2. #include <string>
  3. #include <assert.h>
  4. #include "leveldb/db.h"
  5. //#include "leveldb/c.h"
  6. using namespace std;
  7. int main(void)
  8. {
  9. leveldb::DB *db;
  10. leveldb::Options options;
  11. options.create_if_missing = true;
  12. // open
  13. leveldb::Status status = leveldb::DB::Open(options, "./tmp/testdb", &db);
  14. assert(status.ok());
  15. string key = "t0";
  16. string value = "1";
  17. // write
  18. status = db->Put(leveldb::WriteOptions(), key, value);
  19. assert(status.ok());
  20. status = db->Put(leveldb::WriteOptions(), "t1", "1");
  21. assert(status.ok());
  22. status = db->Put(leveldb::WriteOptions(), "t2", "2");
  23. assert(status.ok());
  24. status = db->Put(leveldb::WriteOptions(), "t3", "3");
  25. assert(status.ok());
  26. status = db->Put(leveldb::WriteOptions(), "t4", "4");
  27. assert(status.ok());
  28. status = db->Put(leveldb::WriteOptions(), "t5", "5");
  29. assert(status.ok());
  30. status = db->Put(leveldb::WriteOptions(), "t5", "6"); //key不能重复,否则值会被覆盖
  31. assert(status.ok());
  32. //read
  33. leveldb::Iterator* it = db->NewIterator(leveldb::ReadOptions());
  34. for (it->SeekToFirst(); it->Valid(); it->Next()) {
  35. std:: cout << it->key().ToString() << ": " <<
  36. it->value().ToString() << std:: endl;
  37. }
  38. assert(it->status().ok());
  39. // close
  40. delete db;
  41. return 0;
  42. }
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值