leveldb自定义env
未完待续。。。
由于项目需求,需要自定义LevelDB的env,也就是以块接口实现env中各个文件接口,在网上没找到类似的代码,就打算自己参照util/env_posix.cc实现一个简单的demo,等到功能实现差不多的时候,却发现leveldb有一个类似功能的代码helpers/memenv/memenv.cc,且各方面都写的比我好,所以就只是简要介绍代码了,主要记录实现过程中遇到的问题。
增加了四个文件 filesystem.h filesystem.c simple_env.h simple_env.c
github链接:leveldb_env
自然而然地,看到undefined我就使用nm命令列出了simple_env.o定义的符号,却发现没有我定义那些函数,我就认为问题出现在这里,实际上当时我将所有的实现都写在了头文件里,也就是说全都是内联函数,内联函数本来就不会出现在符号表中。
简单测试:
class Test {
public:
int info() { return a; } // 内联函数
void print(); // 非内联函数
private:
int a;
};
void Test::print() {
int a;
int b = a + 1;
}
root@ubuntu ~/l/l/test (main)# g++ inline_test.cpp -c
root@ubuntu ~/l/l/test (main)# nm inline_test.o
0000000000000000 T _ZN4Test5printEv
C++内联函数的使用
而后调转方向,查看undefined reference to `typeinfo for leveldb::SequentialFile’错误信息的相关博客,找到了以下博客
Undefined Reference to Typeinfo
混用了no-RTTI代码和RTTI代码,查看LevelDB的CMakeLists.txt,发现确实禁用了RTTI
# Disable RTTI.
string(REGEX REPLACE "-frtti" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")
故编译测试程序时加上编译选项-fno-rtti
g++ test.cpp -o test -g -pthread -lleveldb -fno-rtti
编译成功!
阅读RTTI的相关博客
Is there life without RTTI or How we wrote our own dynamic_cast
谷歌C++风格指南 运行时类型识别
运行时类型信息RTTI