LevelDB是一个在Google编写的快速键值存储库,它提供了从字符串键到字符串值的有序映射。leveldb 库提供了一个持久的键值存储。键和值是任意字节数组。键在键值存储中根据用户指定的比较器功能进行排序。Prometheus LevelDB 用于存储索引
最近打算学习leveldb的源码,安装leveldb时遇到问题,记录一下。
环境:ubuntu20.4
1 首先是下载源码
git clone https://github.com/google/leveldb.git
然后打开readme文件,安装
mkdir -p build && cd build # 创建build目录,并进入
cmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build . # 编译
出现以下错误
各方查资料才知道可能是缺少googletest和benchmark,一看,果然是
于是乎,去github的源码是看了眼,源码下是有文件的
https://github.com/google/benchmark/tree/7d0d9061d83b663ce05d9de5da3d5865a3845b79
法一:在third_party目录下执行
# 下载依赖第三方库(benchmark、googletest)
git submodule update --init
法二:分别下载源码,将这两部分内容解压到对应的目录下
https://github.com/google/benchmark/tree/7d0d9061d83b663ce05d9de5da3d5865a3845b79
(法二,我没有测试)
2 继续回到build目录中
cmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build .
到这里,编译成功。
3 测试
./leveldb_tests
4 安装leveldb
sudo make install
5 leveldb的使用
测试代码
/*************************************************************************
> File Name: demo.cpp
> Author: Winter
> Created Time: 2022年08月06日 星期六 16时28分38秒
************************************************************************/
#include <iostream>
#include <assert.h>
#include "leveldb/db.h"
using namespace std;
using namespace leveldb;
int main(int argc, char *argv[])
{
leveldb::DB *db;
leveldb::Options options;
options.create_if_missing = true;
leveldb::Status status = leveldb::DB::Open(options, "testdb", &db);
assert(status.ok());
status = db->Put(WriteOptions(), "first", "hello world!");
assert(status.ok());
string res;
status = db->Get(ReadOptions(), "first", &res);
assert(status.ok());
cout << res << endl;
delete db;
return 0;
}
测试
g++ demo.cpp -o demo -pthread -lleveldb
真心累。。。。。。
查了一下,发现可能是编译器找不到snappy这个库,在网上搜索了下,发现这个是一个压缩库,google的很多项目喜欢使用这个库,其特点是压缩效率高,可以进行PB级压缩。
安装snappy这个库,详见:
(36条消息) ubuntu下的snappy安装配置以及测试_xiaobo_z的博客-CSDN博客_ubuntu安装snappy
这里还会出现缺少googletest和benchmark的错误,这次我用的是下载源码安装,即上述法二。
https://github.com/google/benchmark/tree/7d0d9061d83b663ce05d9de5da3d5865a3845b79
https://github.com/google/googletest/tree/662fe38e44900c007eccb65a5d2ea19df7bd520e
最终结果,注意路径
再次测试
g++ demo.cpp -o demo -pthread -lleveldb -lsnappy
结果
成功!!!
贴一个makefile,生成cpp同名的可执行文件
src = $(wildcard *.cpp) # 拿到所有*.cpp
target = $(patsubst %.cpp, %, $(src)) # 将src中所有%.cpp替换成%
CC = g++
ALL:$(target)
%:%.cpp
$(CC) $< -o $@ -pthread -lleveldb -lsnappy -g -Wall
clean:
-rm -rf $(target)
.PHONY:clean ALL
参考:
(1)【Linux系统下levelDB的安装和使用】_u010427192的博客-CSDN博客_leveldb安装
(2)undefined reference to `snappy::MaxCompressedLength(unsigned long)'_道希的博客-CSDN博客
(3)(36条消息) ubuntu下的snappy安装配置以及测试_xiaobo_z的博客-CSDN博客_ubuntu安装snappy