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
- #include
- #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