由于服务器依赖比较老旧,因此需要重新安装各种依赖
leveldb依赖安装
1 | sudo yum update |
如果cmake无法安装到3.9以上的版本,可以从官网下载,然后直接解压到项目目录下,之后直接使用绝对路径或相对路径调用cmake,gcc和g++推荐使用7.5
snappy编译
1 | git clone https://github.com/google/snappy.git |
leveldb编译
使用--recurse-submodules
下载subgit中的内容,使用git tag
查看tag,选择最新的release,最后使用git checkout
切换到最新的release版本上
1 | git clone --recurse-submodules https://github.com/google/leveldb.git |
1 | mkdir -p build && cd build |
执行测试检查编译是否成功
1 | ./db_bench |
snappy支持
修改leveldb/CMakeLists.txt
, 在check_library_exists(snappy snappy_compress "" HAVE_SNAPPY)
语句前后添加依赖
其中/home/someone/project/snappy
和/home/someone/project/snappy/build
需要替换成自己的snappy源码目录和build目录
添加后形式如下:
1 | # 之前添加依赖 |
重新编译和测试
1 | mkdir -p build && cd build |
静态编译leveldb
因为服务器环境问题,需要静态编译leveldb, 尤其是静态编译libgcc和libg++
在check_library_exists(snappy snappy_compress "" HAVE_SNAPPY)
语句前后添加link_libraries
标签配置所有的目标静态链接gcc和g++
1 | link_libraries(-static-libgcc -static-libstdc++) |
执行ldd db_bench
可以看到已经不再依赖gcc和g++了
执行strings /lib64/libstdc++.so.6 | grep GLIBCXX
可以查看目前支持的版本
可能会遇到如下报错:
找不到成员
这种情况是由于gcc、g++版本太低导致的,需要升级版本
1
2
3leveldb/third_party/googletest/googletest/include/gtest/gtest-matchers.h:414:12: error: ‘is_trivially_copy_constructible’ is not a member of ‘std’
std::is_trivially_copy_constructible<M>::value &&
^使用如下命令检查版本
1
2gcc -v
g++ -v/bin/c++ /bin/cc缺失
这种情况是软链缺失导致的,报错如下
1
2
3
4
5
6
7
8
9
10CMake Error at CMakeLists.txt:7 (project):
The CMAKE_CXX_COMPILER:
/bin/c++
is not a full path to an existing compiler tool.
Tell CMake where to find the compiler by setting either the environment
variable "CXX" or the CMake cache entry CMAKE_CXX_COMPILER to the full path
to the compiler, or to the compiler name if it is in the PATH.此时需要手动恢复软链,使用
which gcc
和which g++
确定安装位置,然后使用ln设置软链1
2ln -s /usr/local/bin/g++ /bin/c++
ln -s gcc /bin/cc/lib64/libstdc++.so.6: version `GLIBCXX_3.4.22’ not found
建议使用静态链接
demo
编写一个简单的测试demo, 放在与leveldb根目录同级的目录下
1 |
|
执行命令, 编译leveldb需要使用-Ileveldb/include
引入头文件,-Lleveldb/build
设置链库地址, -lleveldb -lpthread
指定要链接的库, -o leveldbtest
指定输出名字
1 | g++ leveldbtest.cc -Ileveldb/include -Lleveldb/build -lleveldb -lpthread -o leveldbtest |
运行结果如下
1 | write:(name)=>(shane) |