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

扫描二维码关注公众号,回复: 1535704 查看本文章

三、导入文件

本文使用的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的例子:

#include <iostream>
#include <string>
#include <assert.h>    
#include "leveldb/db.h" 
#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 = "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 <iostream>
#include <string>
#include <assert.h>    
#include "leveldb/db.h" 
//#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;
}


猜你喜欢

转载自blog.csdn.net/ncut_nwpu/article/details/80604356