Windows下使用clion调试LevelDB与rocksdb

博客介绍了LevelDB和RocksDB的编译运行方法。对于LevelDB,需下载源码、增加测试文件、更新cmake文件后运行;对于RocksDB,同样要下载代码、修改CMakelist.txt并运行。还提及已安装RocksDB时CMakeList的写法,以及Windows下看不到头文件的解决办法。

关于leveldb

下载leveldb源码

链接: leveldbGit地址

增加测试文件

使用clion打开项目,在根目录下新建一个app目录,app目录下新建一个main.cpp。代码如下:

//
//
#include <cassert>
#include <iostream>
#include "include/leveldb/db.h"


int main() {
  //std::cout << "leveldb open success!" << std::endl;
  //return 0;

  leveldb::DB *db;
  leveldb::Options options;
  options.create_if_missing = true;
  leveldb::Status status = leveldb::DB::Open(options, "c://myLevelDB", &db);
  assert(status.ok());
  std::cout << "leveldb open success!" << std::endl;
  std::string value;
  std::string key1 = "testkey1";
  leveldb::Status s = db->Get(leveldb::ReadOptions(), key1, &value);
  if (s.IsNotFound()) {
    std::cout << "can not found for key:" << key1 << std::endl;
    db->Put(leveldb::WriteOptions(), key1, "testvalue1");
  }
  s = db->Get(leveldb::ReadOptions(), key1, &value);
  if (s.ok()) {
    std::cout << "found key:" << key1 << ",value:" << value << std::endl;
  }
  s = db->Delete(leveldb::WriteOptions(), key1);
  if (s.ok()) {
    std::cout << "delete key success which key:" << key1 << std::endl;
  }
  s = db->Get(leveldb::ReadOptions(), key1, &value);
  if (s.IsNotFound()) {
    std::cout << "can not found after delete for key:" << key1 << std::endl;
  }
  delete db;
  return 0;
}


更新cmake文件

在CMakeList.txt里面寻找leveldbutil字符串,然后在下面增加

add_executable(myTest "app/main.cpp")
target_link_libraries(myTest leveldb)

最终效果如下:
在这里插入图片描述

运行

在这里插入图片描述

关于RocksDB

下载RocksDB代码

同上,在根目录的app目录下增加测试文件main.cpp,代码如下:

//
// Created by  on 2024/1/11.
//
#include <iostream>
#include <string>

#include "rocksdb/db.h"
#include "rocksdb/options.h"
#include "rocksdb/slice.h"

using ROCKSDB_NAMESPACE::DB;
using ROCKSDB_NAMESPACE::Options;
using ROCKSDB_NAMESPACE::PinnableSlice;
using ROCKSDB_NAMESPACE::ReadOptions;
using ROCKSDB_NAMESPACE::Status;
using ROCKSDB_NAMESPACE::WriteBatch;
using ROCKSDB_NAMESPACE::WriteOptions;

// rocksdb存储路径
std::string kDBPath="c://myrocksdb";

int main()
{
  DB* db;
  Options options;
  options.IncreaseParallelism();
  //文件夹没有数据就创建
  options.create_if_missing=true;
  // 打开数据库,加载数据到内存
  Status s=DB::Open(options,kDBPath,&db);
  assert(s.ok());
  // 写key-value
  s=db->Put(WriteOptions(),"key01","value");
  assert(s.ok());

  std::string value;
  s=db->Get(ReadOptions(),"key01",&value);
  assert(s.ok());
  std::cout<<"get value  "<< value<<std::endl;
  assert(value=="value");
  // 管道,原子方式更新
  {
    WriteBatch batch;
    batch.Delete("key01");
    batch.Put("key02",value);
    s=db->Write(WriteOptions(),&batch);
  }
  s=db->Get(ReadOptions(),"key01",&value);
  assert(s.IsNotFound());
  s=db->Get(ReadOptions(),"key02",&value);
  assert(value=="value");

  {
    PinnableSlice pinnable_val;
    // 列族方式读取
    db->Get(ReadOptions(),db->DefaultColumnFamily(),"key02",&pinnable_val);
    assert(pinnable_val=="value");
  }

  {
    std::string string_val;
    PinnableSlice pinnable_val(&string_val);
    // 列族方式读取
    db->Get(ReadOptions(),db->DefaultColumnFamily(),"key02",&pinnable_val);
    assert(pinnable_val=="value");
    assert(pinnable_val.IsPinned() || string_val == "value");
  }

  PinnableSlice pinnable_val;
  s=db->Get(ReadOptions(),db->DefaultColumnFamily(),"key01",&pinnable_val);
    assert(s.IsNotFound());

    pinnable_val.Reset();
    db->Get(ReadOptions(),db->DefaultColumnFamily(),"key02",&pinnable_val);
    assert(pinnable_val=="value");
    pinnable_val.Reset();

    delete db;

    return 0;
}

修改CMakelist.txt

增加如下内容:

add_executable(myTest "app/main.cpp")
target_link_libraries(myTest ${ROCKSDB_STATIC_LIB})

效果如下:
在这里插入图片描述

运行

在这里插入图片描述

已经安装好rocksdb的情况

上面的case是咱们直接下载了Rocksdb,然后把测试代码就放到原生的rocksdb代码内部进行验证。
假定有一种case是,我们已经安装好了rocksdb,那么该怎么写CMakeList呢?
CMakeLists.txt如下:

find_library(GFLAGS_LIB123 gflags)
message(STATUS "find succ b ${GFLAGS_LIB123}")

find_library(ROCKSDB_LIB123 rocksdb)
message(STATUS "find succ b ${ROCKSDB_LIB123}")

add_executable(TestRocksdb3 "test/TestRocksdb.cpp")
target_link_libraries(TestRocksdb3 ${ROCKSDB_LI123B}  ${GFLAGS_LIB123})

上面的find_library(ROCKSDB_LIB123 ROCKSDB_LIB) 就是在系统的bin目录去查找rocksdb,然后把路径保存到ROCKSDB_LIB123 。
至于为什么我们在源代码里验证不需要gflags,而安装之后就要gflags。我也不清楚。

编译结果如下:
在这里插入图片描述

windows下看不到头文件

如果我们是在window下通过远程部署代码到linux上的时候,上面的代码在linux能正常运行,但是我们在windows会发现找不到rocksdb/slice.h这些文件。怎么办呢?
因为windows下这个目录没有rocksdb的头文件,那怎么办呢?把这个文件夹删除,让clion从linux重新同步一下代码。
在这里插入图片描述

参考资料:

https://zhuanlan.zhihu.com/p/653465714
https://zhuanlan.zhihu.com/p/611450548

Windows 系统下使用 CLion 编译项目时,若执行 CMake 报错且问题可能 BAT 文件或环境配置有关,通常是因为开发工具链的路径未正确设置或当前命令行环境无法识别编译器。 --- ### 原因分析 1. **编译器路径未正确设置** CMake 依赖于系统环境变量中定义的编译器路径。如果 `cl.exe`(MSVC 编译器)不在系统 PATH 中,CMake 将无法找到它,从而导致报错 `The CMAKE_C_COMPILER: cl is not a full path and was not found in the PATH` [^1]。 2. **未使用正确的命令行环境运行 CMake** 在 Windows使用 NMake Makefiles 生成器时,必须确保运行 CMake 的命令行环境能够调用 MSVC 工具链。否则会出现 `The C compiler identification is unknown` 等错误 [^2]。 3. **BAT 脚本未加载 Visual Studio 编译器环境变量** 如果通过自定义的 `.bat` 文件运行 CMake 而没有先调用 `vcvarsall.bat`,那么编译器相关的环境变量将不会被加载,导致 CMake 找不到编译器 [^1]。 --- ### 解决方案 #### 方法一:手动运行 `vcvarsall.bat` 设置环境变量 在调用 CMake 之前,应首先运行 Visual Studio 提供的 `vcvarsall.bat` 脚本来加载必要的编译器环境变量。例如: ```bat call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" x64 cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release .. ``` 其中: - `"C:\Program Files\Microsoft Visual Studio\2022\Community\"` 是你的 VS 安装路径。 - `x64` 表示目标架构,也可以是 `x86` 或 `arm64`。 #### 方法二:在 CLion 中配置 Toolchain 和 CMake 选项 进入 **File → Settings → Build, Execution, Deployment → Toolchains**,添加一个新的 Toolchain 并选择以下内容: - **C Compiler**: `cl.exe` - **C++ Compiler**: `cl.exe` - **Linker**: `link.exe` - **Toolset**: 选择对应的 Visual Studio 版本安装路径 [^2] 然后,在 **CMake settings** 中指定生成器和构建类型: ```txt -G "Visual Studio 17 2022" -T host=x64 -A x64 -DCMAKE_BUILD_TYPE=Debug ``` 确保 `-G` 参数匹配你的 Visual Studio 版本,并根据需要选择构建类型(`Debug` 或 `Release`)[^3]。 #### 方法三:检查 SDK 版本兼容性 如果出现 `The C compiler identification is unknown` 错误,可能是由于 SDK 版本不兼容。此时可以通过重新运行 Visual Studio 安装程序,更新或安装更高版本的 Windows SDK 来解决该问题 [^2]。 #### 方法四:验证环境变量是否包含编译器路径 检查系统环境变量 `PATH` 是否包含以下路径(以 VS2022 为例): ```txt C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.34.31933\bin\Hostx64\x64 C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64 ``` 如果没有,请手动添加这些路径或通过 `vcvarsall.bat` 加载环境变量。 --- ### 示例脚本(bat 文件) 下面是一个完整的 `.bat` 示例脚本,用于配置环境并运行 CMake: ```bat @echo off :: 设置 Visual Studio 安装路径 call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" x64 :: 切换到项目构建目录 cd /d D:\my_project\build :: 运行 CMake 配置 cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug .. :: 构建项目 nmake ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值