Windows下 VS2015编译RocksDB

RocksDB系列一:RocksDB基础和入门 1、简介       RocksDB是FaceBook起初作为实验性质开发的一个高效数据库软件,旨在充分实现快存上存储数据的服务能力。RocksDB是一个c++库,可以用来存储keys和values,且keys和values可以是任意的字节流,支持原子的读和写。除此外,RocksDB深度支持各种配置,可以在不同的生产环境(纯内存、Flash、hard disks or HDFS)中调优,支持不同的... 阅读详情

VS2015编译RocksDB

RocksDB 是一个来自 facebook 的可嵌入式的支持持久化的 key-value 存储系统,也可作为 C/S 模式下的存储数据库,但主要目的还是嵌入式。RocksDB 基于 LevelDB 构建。

1、下载rocksdb源码

git clone https://github.com/facebook/rocksdb.git

2、使用CMAKE生成VS工程

打开cmd窗口(最好使用VS2015开发人员命令提示),进入源码目录,执行下面命令

mkdir msvc14    # 创建构建目录
cd msvc14       # 进入构建目录
# 生成VS项目(D:\Libs\rocksdb是编译后安装路径)
cmake -DCMAKE_INSTALL_PREFIX=D:\Libs\rocksdb -G "Visual Studio 14 Win64" ..

实际上rocksdb源码目录中的CMakeList.txt文件中并没有写INSTALL段的内容,所以这里指定安装路径实际是无效的。

3、编译RocksDB

打开VS2015 x64 本机工具命令提示(或VS2015开发人员命令提示)工具,执行下面命令进行编译64位release版本的RocksDB库

msbuild ALL_BUILD.vcproject /p:configuration=release /maxcpucount:8

因为test项目也都编译了,文件较多,所以这里使用了/maxcpucount:8指定使用的CPU核心数。
如果只编译rocksdb(静态)库,可以使用msbuild rocksdblib.vcproject /p:configuration=release命令
编译动态库使用msbuild rocksdb.vcproject /p:configuration=release命令

编译完成后,通过的做法是使用下面命令进行安装

msbuild INSTALL.vcproject /p:configuration=release

但是这里没有生成INSTALL.vcproject,所以这里的安装需要手动进行。
直接拷贝msvc14/Release目录下的rocksdblib.lib文件和源码目录的include目录即可。

4、编译后续

因为编译出来的是动态库,但是实际上RocksDB的代码中比没有使用__declspec(dllexport)导出函数和类接口,所以在使用的时候会遇到类似如下的问题

rocksdb_test.obj : error LNK2019: 无法解析的外部符号 "public: __cdecl rocksdb::ColumnFamilyOptions::ColumnFamilyOptions(void)" (??0ColumnFamilyOptions@rocksdb@@QEAA@XZ),该符号在函数 "public: __cdecl rocksdb::Options::Options(void)" (??0Options@rocksdb@@QEAA@XZ) 中被引用
rocksdb_test.obj : error LNK2019: 无法解析的外部符号 "public: __cdecl rocksdb::DBOptions::DBOptions(void)" (??0DBOptions@rocksdb@@QEAA@XZ),该符号在函数 "public: __cdecl rocksdb::Options::Options(void)" (??0Options@rocksdb@@QEAA@XZ) 中被引用
rocksdb_test.obj : error LNK2019: 无法解析的外部符号 "public: __cdecl rocksdb::ReadOptions::ReadOptions(void)" (??0ReadOptions@rocksdb@@QEAA@XZ),该符号在函数 main 中被引用
rocksdb_test.obj : error LNK2019: 无法解析的外部符号 "public: static class rocksdb::Status __cdecl rocksdb::DB::Open(struct rocksdb::Options const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class rocksdb::DB * *)" (?Open@DB@rocksdb@@SA?AVStatus@2@AEBUOptions@2@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PEAPEAV12@@Z),该符号在函数 main 中被引用
rocksdb_test.exe : fatal error LNK1120: 4 个无法解析的外部命令

这里可以打开生成的VS工程,将配置类型改为静态库,然后再生成静态库即可。

生成后即可使用了。但是还会遇到下面的问题

rocksdb.lib(env_win.obj) : error LNK2019: 无法解析的外部符号 __imp_RpcStringFreeA,该符号在函数 "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl rocksdb::Env::GenerateUniqueId(void)" (?GenerateUniqueId@Env@rocksdb@@UEAA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) 中被引用
rocksdb.lib(env_win.obj) : error LNK2019: 无法解析的外部符号 __imp_UuidCreateSequential,该符号在函数 "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl rocksdb::Env::GenerateUniqueId(void)" (?GenerateUniqueId@Env@rocksdb@@UEAA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) 中被引用
rocksdb.lib(env_win.obj) : error LNK2019: 无法解析的外部符号 __imp_UuidToStringA,该符号在函数 "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl rocksdb::Env::GenerateUniqueId(void)" (?GenerateUniqueId@Env@rocksdb@@UEAA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) 中被引用
rocksdb_test.exe : fatal error LNK1120: 3 个无法解析的外部命令

这些函数实际上是在Rpcrt4.lib这个库里面,所以需要链接上才行。可以在使用的时候在代码中添加#pragma comment(lib,"Rpcrt4.lib")来引入。

相关测试代码如下

#include <cassert>  
#include <string>  
#include <iostream>
#include <chrono>

#include "rocksdb/db.h"  

#pragma comment(lib,"Rpcrt4.lib")

#define TEST_FREQUENCY  (10000)

char* randomstr()
{
    static char buf[1024];
    int len = rand() % 768 + 255;
    for (int i = 0; i < len; ++i) {
        buf[i] = 'A' + rand() % 26;
    }
    buf[len] = '\0';
    return buf;
}

int main() 
{
    rocksdb::DB* db;
    rocksdb::Options options;
    options.create_if_missing = true;

    // 打开数据库
    rocksdb::Status status = rocksdb::DB::Open(options, "./testdb", &db);
    assert(status.ok());

    srand(2017);
    std::string k[TEST_FREQUENCY];
    for (int i = 0; i < TEST_FREQUENCY; ++i) {
        k[i] = (randomstr());
    }
    std::string v("壹贰叁肆伍陆柒捌玖拾");
    v.append(v).append(v).append(v).append(v).append(v);

    // 测试添加
    {
        auto start = std::chrono::system_clock::now();
        for (int i = 0; i < TEST_FREQUENCY; ++i) {
            status = db->Put(rocksdb::WriteOptions(), k[i], v);
            assert(status.ok());
        }
        auto end = std::chrono::system_clock::now();
        auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);

        std::cout << TEST_FREQUENCY <<"次添加耗时: "
            << double(duration.count()) * std::chrono::microseconds::period::num / std::chrono::microseconds::period::den
            << "秒" << std::endl;
    }
    // 测试获取
    {
        auto start = std::chrono::system_clock::now();
        std::string v2[TEST_FREQUENCY];
        for (int i = 0; i < TEST_FREQUENCY; ++i) {
            status = db->Get(rocksdb::ReadOptions(), k[i], &v2[i]);
            assert(status.ok());
        }
        auto end = std::chrono::system_clock::now();
        auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);

        std::cout << TEST_FREQUENCY <<"次获取耗时: "
            << double(duration.count()) * std::chrono::microseconds::period::num / std::chrono::microseconds::period::den
            << "秒" << std::endl;
        // 验证获取结果是否正确
        std::string ss;
        for (int i = 0; i < TEST_FREQUENCY; ++i) {
            if (v2[i] != v) {
                std::cout << "第 " << i << " 个结果不正确" << std::endl;
                std::cout << v2[i] << std::endl;
            }
        }
    }
    // 测试修改
    {
        auto start = std::chrono::system_clock::now();
        v.append(v);
        for (int i = 0; i < TEST_FREQUENCY; ++i) {
            status = db->Put(rocksdb::WriteOptions(), k[i], v);
            assert(status.ok());
        }
        auto end = std::chrono::system_clock::now();
        auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);

        std::cout << TEST_FREQUENCY <<"次修改耗时: "
            << double(duration.count()) * std::chrono::microseconds::period::num / std::chrono::microseconds::period::den
            << "秒" << std::endl;
    }

    // 测试删除
    {
        auto start = std::chrono::system_clock::now();
        for (int i = 0; i < TEST_FREQUENCY; ++i) {
            status = db->Delete(rocksdb::WriteOptions(), k[i]);
            assert(status.ok());
        }
        auto end = std::chrono::system_clock::now();
        auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);

        std::cout << TEST_FREQUENCY <<"次删除耗时: "
            << double(duration.count()) * std::chrono::microseconds::period::num / std::chrono::microseconds::period::den
            << "秒" << std::endl;
    }
    delete db;
    return 0;
}

编译命令如下:

# Debug版本
cl rocksdb_test.cpp /I ..\..\libs\vs140-x64\rocksdb\include  ..\..\libs\vs140-x64\rocksdb\Debug\rocksdb.lib /MDd /EHsc \
/GF /TP /Zp8 /Od /Gy /W3 /D "OS_WIN" /D "WIN32" /D "_WINDOWS" /D "NDEBUG" /D "ROCKSDB_LITE" /D "_MBCS" /D "WIN64" /D "NOMINMAX" 

# Release版本
cl rocksdb_test.cpp /I ..\..\libs\vs140-x64\rocksdb\include  ..\..\libs\vs140-x64\rocksdb\Release\rocksdb.lib /MD /EHsc \
/GF /TP /Zp8 /O2 /Gy /W3 /D "OS_WIN" /D "WIN32" /D "_WINDOWS" /D "NDEBUG" /D "ROCKSDB_LITE" /D "_MBCS" /D "WIN64" /D "NOMINMAX" 

注意上面使用了/Zp8和/TP /GF等选项。如果不设置/Zp8(8字节对齐),在运行时候会抛出异常。因为VS编译64位程序的时候,默认就是8字节对齐,而我没有测试32位版本的,所以这里可能不是关键。

后话

Linux下的编译都比较简单,包括LevelDB等,都只需要直接make即可。Linux下编译的时候可能有某些依赖需要安装一下,包括gflags、jemalloc、libsnappy、libbz2、liblz4等。

RocksDB 详解 RocksDB是由Facebook基于Google LevelDB开发的高性能KV存储引擎,采用LSM-Tree结构,具有出色的读写性能(随机读取峰值19万次/秒)。虽然不直接用于业务系统,但已成为CockroachDB、TiDB、MongoDB等数据库的底层存储引擎。其核心设计包括MemTable、WAL日志和多层SST文件,通过Compaction策略实现数据分层存储。文章提供了Java操作示例,展示了基本CRUD功能,并对比了RocksDB与其他存储引擎的性能优势。RocksDB凭借高性能和事务支持能 阅读详情

相关推荐

【信息科学与工程学】【数据中心】第三十五篇 云计算数据中心的学科知识04

编号学科(课程)核心知识点在云计算/云存储/云网络/云安全/云MaaS中的作用代表教材/资料/论文 + 数学方程式列表工业界应用D1421​云原生数据库:TiDB​HTAP(混合事务/分析处理)、分布式SQL、水平扩展、强一致(Raft)、自动故障恢复、与MySQL兼容、TiFlash列式引擎提供弹性扩展的分布式数据库;支撑高并发在线交易与实时分析教材:《TiDB in Action》PingCAP(2020) 论文:《TiDB: A Raft-based HTAP Database》(2017)

weixin_49199313的博客 399

Leveldb vs Rocksdb 在windows下的编译安装

一、前言 有一个微服务系统涉及mongodb,计算服务在运行时需要从mongo拉大量数据,一来一回,不仅mongo容器占用大量内存,服务之间交换数据也拖累了计算时间,这也造成新加的ssd 最高读取速度3500MB/S,完全无用武之地。 那么把数据留一份在宿主机,或许是一个好选择,毕竟 pandas读取csv文件也挺快. OR 改一把,历史数据存在本地的leveldb/rocksdb中也行喽 试一试 总之 多匀些内存给计算服务 岂不美哉 二、安装VCPKG 宿主机是win10,用vcpkg自动

kldoo的专栏 2848

rocksdb install

rocksdb安装,包括gcc更新、依赖项安装

windows、visual studio 2015上编译Caffe2

windows、visual studio 2015上编译Caffe2一、软件准备二、CMD窗口安装模块三、增加/修改环境变量四、修改build_host_protoc.bat五、修改build_windows.bat六、修改Cuda.cmake七、CMD窗口编译八、VS编译九、拷贝十、运行MNIST.PY检验 一、软件准备 Windows 10 64位; Visual studio 2015 ...

fengye2two的专栏 821

rocksdb 6 with jemallc win msvc2017 + jni/java + lz4 + bz2 + zlib + zstd

rocksdb 6.6 with jemallc msvc2017 + jni/java + lz4 + bz2 + zlib + zstd

msf使用木马控制android手机

使用msfvenom生成木马控制手机

my_name_is_sy的博客 3520

攻克RocksDB Windows构建“静默死亡“难题:从0到1的故障排除指南

RocksDB是Facebook开发的高性能嵌入式键值存储库,基于LevelDB构建,广泛应用于需要高效数据持久化的场景。然而在Windows平台上构建RocksDB时,开发者常遭遇令人沮丧的"静默死亡"问题——编译过程无错误提示却突然终止。本文将系统梳理Windows环境下RocksDB构建的常见陷阱与解决方案,帮助开发者顺利搭建开发环境。 ## 一、Windows构建环境准备清单 📋 成

gitblog_00712的博客 417

科大讯飞(1): 环形6麦语音唤醒—驱动板上的接口

介绍环形麦阵列驱动板上的接口,及其疑问

bing_feilong的博客 1175

【Caffe2】Windows7下caffe2编译配置全记录(GPU版)

1. 准备工作 (1)安装CUDA、cuDNN (2)安装Python (3)安装Visual Studio (4)安装Cmake (5)安装依赖库 2. 编译Caffe2 (1)获取源码 (2)构建sln工程 (3)编译protobuf库 (4)编译Caffe2源码 【常见问题】 3.测试Caffe2 https://caffe2.ai/docs/getting-sta...

signal926的专栏 3293

Oracle Patch清理

- opatch clean的帮助,该命令清除.patch_storage directory文件夹下的'restore.sh,make.txt' files and 'scratch,backup'-- 执行完毕后,貌似没有变化,可能和自己环境有关(19年开始测试补丁,基本上每个季度都测试,后面把又把数据库用RMAN做了迁移,又转换成了PDB模式)。在对Oracle安装补丁后,会发现OS上被占用了大量的空间,本文档清理Opatch过程中的一些文件,释放空间。--清理后空间,剩余25G。

文档搬运工 1069

13、基因相似性度量的相关性及特征选择研究

本文研究了基因相似性度量和特征选择在生物学中的应用,详细介绍了GO术语相似性度量的多种方法,包括语义度量和路径长度度量,并分析了不同方法在酵母和人类数据集上的表现。研究发现,Avg-sum方法和基于路径长度的度量在多数情况下效果较好。此外,通过晚期辐射毒性预测的案例研究,探讨了特征选择的重要性及可能面临的过拟合和噪声干扰问题,并提出了相应的解决策略。

js777的博客 127

Caffe2的安装

源码下载 首先下载caffe2的源码:https://github.com/caffe2/caffe2 网上都建议使用git命令下载,因为caffe2依赖了很多第三方模块,git会根据依赖自动下载第三方依赖模块。但是我在下载过程中发现很多第三方模块的地址变了,因此git方式无法完成第三方模块的下载。因此,下载好caffe2源码后,需要手动完成这些模块的下载。这些模块的默认地址在caffe2/....

weixin_30736301的博客 302

第11节:GPU 线程层级:线程、线程块、网格

层级标识变量功能线程threadIdx执行单元,处理数据线程块blockIdx管理多个线程,提供共享内存网格管理多个 blockGPU 编程中,合理安排线程层级,是提升性能的关键。

yumeiguo的博客 209

Rust 快速入门:从 Hello World 到第一个 Cargo 项目

核心痛点:系统编程四十年困局——C/C++ 的性能无可匹敌,但其内存安全完全依赖开发者纪律。2019 年微软安全响应中心报告指出,微软修复的安全漏洞中约70%是内存安全漏洞;Google Project Zero 对 2015-2020 年的零日漏洞分析得出了同样结论。Java/Go 等 GC 语言用垃圾回收换来了安全,却引入了不可预测的暂停时间和重量级运行时——这对操作系统内核、数据库引擎、游戏渲染管线而言是不可接受的。

我的博客 599

模型训练篇 | 手把手教你使用ResNet训练自己数据集和推理,ResNet50通用物体分类识别,含完整代码和数据集,全网最详细教程

手把手教你使用ResNet训练自己数据集和推理,ResNet50通用物体分类识别,含完整代码和数据集,全网最详细教程。本篇文章将带你学习 ResNet50 模型构建、ResNet50训练自己数据集、数据集处理、推理和验证、模型剪枝与模型改进等。 本篇教程适配各种分类识别任务,可以说是一个通用的教程,只需修改自己的数据集即可完成自己领域的任务和系统实现。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 720

《YOLOv8-seg改进》专栏指导书册 &手把手创新教程

学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研;1)手把手教你如何训练YOLOv8-seg;2)模型创新,提升分割性能;3)独家自研模块助力分割;

会AI的学姐 3810

Windows下使用clion调试LevelDB与rocksdb

使用clion打开项目,在根目录下新建一个app目录,app目录下新建一个main.cpp。在CMakeList.txt里面寻找leveldbutil字符串,然后在下面增加。

程序员小董的专栏 1202

如何在 SAPGUI 里显示上传到 ABAP 服务器的 PDF 文件

在 SAPGUI 里显示 PDF 文件是实际项目中一个很有用的需求。因为在 SAP 实际业务场景中,有大量的流程会生成 PDF 格式的数据。把这种类型的数据输出显示在 SAPGUI 里,方便最终用户查看。本教程后续步骤,还会向大家介绍如何使用 ABAP 代码生成 PDF 格式的数据。本步骤只是简单的将本地 PDF 文件,上传到 ABAP 系统并显示在 SAPGUI 里。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2684

RocksDB 官方安装指南中文翻译版

RocksDB 官方安装指南:https://github.com/facebook/rocksdb/blob/master/INSTALL.md。 我只是简单做了一个翻译哈,换句话说,我不生产文档,我只是官方文档的翻译工。英语水平有限,有些句子意思大概明白,但是翻译过来就不一定准确,如果发现不太准确的地方,请及时指明。 编译方式 注意:如果你打算在生产环境中使用 RocksDB,请不要使用 make 或者是 make all 的方式进行编译。因为这两种方式会编译出 debug 模式的 RocksDB,性

FishGoddess的博客 7458

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

RocksDB静态编译与使用

演示 RocksDB 的静态编译和 g++ 使用过程,并将踩的坑记录下来

weixin_46322986的博客 2997

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

编译ROCKSDB总结

Rocksdb是挺好的一个东西,就是取得一个可用的库太麻烦。之前我是用的rocksdbsharp里面他有编译好windows 和 linux的库 兼 容性还挺好,ubuntu win10 直接跑没毛病,可惜他是去年build的了,我要用的checkpoint 这么重要的功能,他这个版本没有。于是乎只好自行编译rocksdb,感觉上了一条贼船啊。 我在使用rocksdb开发一个数据库h...

dianjupi9036的博客 688

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

RocksDB

RocksDB是使用C ++编写的嵌入式kv存储引擎,其键值均允许使用二进制流。由Facebook基于levelDB开发,提供向后兼容的levelDB API。 RocksDB针对Flash存储进行优化,延迟极小.RocksDB使用LSM存储引擎,纯C ++编写.Java版本RocksJava正在开发中。参见RocksJavaBasic。 RocksDB依靠大量灵活的配置,使之能针对不同的生产环境...

点点的博客 2279

【亲测免费】 RocksDB 安装和配置指南

### 基础介绍 RocksDB 是一个由 Facebook 开发和维护的嵌入式持久化键值存储库。它特别适用于快速存储环境,如闪存驱动器和高性能磁盘驱动器。RocksDB 基于 Google 的 LevelDB 开发,具有灵活的写放大因子(WAF)、读放大因子(RAF)和空间放大因子(SAF),并且支持多线程压缩,适合存储多 TB 数据。 ### 主要编程语言 RocksDB 主要使用 C++ ...

gitblog_07981的博客 1666
上一篇: valgrind
下一篇: std::numeric_limits 出错
linuxheik
博客等级 码龄15年 865粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值