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的博客 397

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

深入理解HTTPS:从SSLHandshakeException到证书链验证的完整解析

本文深入解析了HTTPS握手过程中常见的SSLHandshakeException异常,特别是由证书链验证失败引发的CertPathValidatorException。文章从TLS握手流程、证书链验证的数学原理出发,详细剖析了Java中TrustManager的工作机制,并提供了针对证书链不完整、自签名证书等典型问题的系统化排查流程与实战解决方案。

weixin_29313423的博客 231

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

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

gitblog_00712的博客 417

基于51单片机的智能花盆灌溉系统设计与实现

本文详细介绍了基于51单片机的智能花盆灌溉系统设计与实现,通过DS18B20温度传感器、土壤湿度传感器和LCD1602显示屏等硬件模块,结合精确的算法控制,实现自动监测与灌溉。系统解决了传统灌溉依赖定时器、缺乏可视化界面的问题,适合上班族、园艺爱好者和植物园工作人员使用,有效提升植物养护效率。

honey的博客 1014

【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

算法导论之线性规划

线性规划,充斥着运筹学,在图的单源最短路径求解差分约束系统就是用到线性规划。怎么样问题可以建模为线性规划来解决呢?在给定的有限的资源和竞争约束情况下,取得最大化或最小化目标的问题。导论中给出政治竞选问题、航空航线调度问题、钻井采油问题。最大化或最小化目标是函数的因变量,自变量就是资源的约束因素,其函数就是由这些制约因素构成的等式或不等式。下面数学定义下线性规划。 在一般线性规划问题中,最优化一个

医疗影像检索 2万+

SSD训练自定义数据集实战:VOC格式标注与模型调参技巧

本文详细介绍了如何使用SSD模型训练自定义VOC格式数据集,包括数据标注工具选择、VOC数据集目录结构规范、数据集划分方法以及模型调参技巧。通过实战案例演示了SSD源码的关键修改点和训练参数优化策略,帮助开发者高效实现目标检测任务。

php55的博客 563

Caffe2的安装

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

weixin_30736301的博客 302

从SSD到UFS:3分钟搞懂存储技术进化史(含最新协议对比)

本文梳理了从SSD到UFS的存储技术演进历程,重点解析了eMMC与UFS在架构上的核心差异。UFS凭借高速串行全双工接口,实现了性能与能效的飞跃。文章还对比了最新的UFS 4.0与PCIe 5.0 SSD协议,并探讨了3D NAND、SLC缓存等底层技术,揭示了移动与PC存储技术融合的未来趋势。

weixin_29294597的博客 276

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

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

我的博客 598

具身智能数据采集的工程化指南:从时间同步到质量校验

具身智能的模型训练离不开高质量的多模态轨迹数据,而数据采集并非简单的传感器记录。真实场景中,相机图像、机械臂关节状态与力觉信息必须在时间轴上精确对齐,标定的漂移和格式混乱会让看似正常的数据无法用于训练。时间同步与标定一致性,是决定数据质量的核心技术环节。在机器人抓取、操作等工程应用中,一套包含多传感器同步、轻量记录脚本、自动化质量校验与版本管理的数据采集流程,能大幅降低数据生产的失败率。本文从工程视角拆解具身数据采集中的典型问题,并给出可落地的流程设计与校验方法,帮助团队构建可持续迭代的高质量数据集。

weixin_30603633的博客 510

【异常】解决JDK21升级中的SecurityException: JCE无法验证BC提供者问题

本文详细解析了JDK21升级中常见的SecurityException: JCE无法验证BC提供者问题的根源与解决方案。核心在于JDK21强化了JCE安全验证,导致签名不合规的老版本Bouncy Castle库被拒绝。文章提供了通过Maven依赖树精准定位、排除旧版本并引入兼容的bcprov-jdk18on新库的完整步骤,以及清理缓存等实战技巧,帮助开发者彻底解决此兼容性问题。

weixin_29197051的博客 488

Windows下使用clion调试LevelDB与rocksdb

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

程序员小董的专栏 1202

Claude桌面端安装失败?Retrying无限重试终极解决方案(亲测有效)

Claude桌面端安装卡在Retrying并非网络问题,而是安装器下载源异常导致。本文提供已验证方案:一条命令即可解决问题🚀

XiaoqiangClub的博客 2331

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

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

FishGoddess的博客 7458

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

RocksDB静态编译与使用

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

weixin_46322986的博客 2997

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

编译ROCKSDB总结

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

dianjupi9036的博客 688

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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、付费专栏及课程。

余额充值