版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/clever_wr/article/details/89288082
说实话自己最近踩了好多坑,只能说在不断的踩坑中成长吧。我只想把在自己搭建连接的时候使用的步骤和问题或者是错误的解决方法分享给你们,也为自己以后再搭建做备份。
1.首先安装依赖的库。(centos 7)
#安装gflags
git clone https://github.com/gflags/gflags.git
cd gflags
mkdir build && cd build && cmake ..
make && make install
#安装这些包
yum install snappy snappy-devel zlib zlib-devel bzip2 bzip2-devel lz4-devel
yum install libasan
#安装zstd
wget https://github.com/facebook/zstd/archive/v1.1.3.tar.gz
mv v1.1.3.tar.gz zstd-1.1.3.tar.gz
tar zxvf zstd-1.1.3.tar.gz
cd zstd-1.1.3
make && sudo make install
2.下载rocksdb。
git clone https://github.com/facebook/rocksdb.git
cd rocksdb
#生成静态库
make static_lib
#生成动态库
make shared_lib
3.复制.h文件到/usr/lib中。
cp -r include/* /usr/include
sudo cp librocksdb.so.6.1.0 /usr/lib
sudo ln -s /usr/lib/librocksdb.so.6.1.0 /usr/lib/librocksdb.so.6
sudo ln -s /usr/lib/librocksdb.so.6.1.0 /usr/lib/librocksdb.so
4.编写测试文件rocksdbtest.cpp
#include <cstdio>
#include <string>
#include "rocksdb/db.h"
#include "rocksdb/slice.h"
#include "rocksdb/options.h"
using namespace std;
using namespace rocksdb;
const std::string PATH = "/home/hsk/kvstore/test_data/rocksdbResult";
int main(){
DB* db;
Options options;
options.create_if_missing = true;
Status status = DB::Open(options, PATH, &db);
assert(status.ok());
Slice key("foo");
Slice value("bar");
std::string get_value;
status = db->Put(WriteOptions(), key, value);
if(status.ok()){
status = db->Get(ReadOptions(), key, &get_value);
if(status.ok()){
printf("get %s\n", get_value.c_str());
}else{
printf("get failed\n");
}
}else{
printf("put failed\n");
}
delete db;
}
5.编译运行该c文件。
g++ -std=c++11 -o rocksdbtest rocksdbtest.cpp -lpthread -lrocksdb
6.下面开始各种报错了。
错误一:
./rocksdbtest: error while loading shared libraries: librocksdb.so.6.1: cannot open shared object file: No such file or directory
解决:
vi /etc/profile
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:/usr/lib
source /etc/profile
错误二:
rocksdbtest: rocksdbtest.cpp:18: int main(): Assertion `status.ok()' failed.
Aborted
解决二:一定要指定一个已经有的数据库存储路径可以通过mkdir新建一个
#include <cstdio>
#include <string>
#include "rocksdb/db.h"
#include "rocksdb/slice.h"
#include "rocksdb/options.h"
using namespace std;
using namespace rocksdb;
const std::string PATH = "/home/hsk/kvstore/test_data/rocksdbResult";//修改此处
int main(){
DB* db;
Options options;
options.create_if_missing = true;
Status status = DB::Open(options, PATH, &db);
assert(status.ok());
Slice key("foo");
Slice value("bar");
std::string get_value;
status = db->Put(WriteOptions(), key, value);
if(status.ok()){
status = db->Get(ReadOptions(), key, &get_value);
if(status.ok()){
printf("get %s\n", get_value.c_str());
}else{
printf("get failed\n");
}
}else{
printf("put failed\n");
}
delete db;
}
6.在上文中安装的mapkeeper中新建rocksdb文件夹。
mkdir rocksdb
cd rocksdb
mkdir data
vi Makefile
在Makefile文件中写入:
include ../Makefile.config
EXECUTABLE = mapkeeper_rocksdb
all : thrift
g++ -Wall -o $(EXECUTABLE) *cpp -I $(THRIFT_DIR)/include/thrift -I $(THRIFT_DIR)/include \
/usr/local/lib/libleveldb.a /usr/local/lib/libsnappy.a -lpthread -lboost_thread -lboost_system -lboost_filesystem -lthrift -lleveldb -I ../thrift/gen-cpp \
-L $(THRIFT_DIR)/lib \
-L ../thrift/gen-cpp -lmapkeeper \
-Wl,-rpath,\$$ORIGIN/../thrift/gen-cpp \
-Wl,-rpath,$(THRIFT_DIR)/lib \
-std=c++11
thrift:
make -C ../thrift
run:
./$(EXECUTABLE) --sync
clean :
-rm -rf $(THRIFT_SRC) $(EXECUTABLE) *.o
wipe:
-rm -rf data/*
然后在rocksdb文件夹下添加RocksdbServer.cpp。我已经上传到我的下载中,可以去下载添加。然后进行make,但是报一下错误。如果报以下错,要更改相应行的boost为std。
RocksDBServer.cpp:344:75: error: no matching function for call to ?.apkeeper::MapKeeperProcessor::MapKeeperProcessor(boost::shared_ptr<RocksDBServer>&)?
boost::shared_ptr<TProcessor> processor(new MapKeeperProcessor(handler));
^
RocksDBServer.cpp:344:75: note: candidates are:
In file included from RocksDBServer.cpp:7:0:
../thrift/gen-cpp/MapKeeper.h:1475:3: note: mapkeeper::MapKeeperProcessor::MapKeeperProcessor(std::shared_ptr<mapkeeper::MapKeeperIf>)
MapKeeperProcessor(::apache::thrift::stdcxx::shared_ptr<MapKeeperIf> iface) :
^
../thrift/gen-cpp/MapKeeper.h:1475:3: note: no known conversion for argument 1 from ?.oost::shared_ptr<RocksDBServer>?.to ?.td::shared_ptr<mapkeeper::MapKeeperIf>?
../thrift/gen-cpp/MapKeeper.h:1456:7: note: mapkeeper::MapKeeperProcessor::MapKeeperProcessor(const mapkeeper::MapKeeperProcessor&)
class MapKeeperProcessor : public ::apache::thrift::TDispatchProcessor {
^
../thrift/gen-cpp/MapKeeper.h:1456:7: note: no known conversion for argument 1 from ?.oost::shared_ptr<RocksDBServer>?.to ?.onst mapkeeper::MapKeeperProcessor&?
RocksDBServer.cpp:348:90: error: no matching function for call to ?.pache::thrift::server::TThreadedServer::TThreadedServer(boost::shared_ptr<apache::thrift::TProcessor>&, boost::shared_ptr<apache::thrift::transport::TServerTransport>&, boost::shared_ptr<apache::thrift::transport::TTransportFactory>&, boost::shared_ptr<apache::thrift::protocol::TProtocolFactory>&)?
TThreadedServer server (processor, serverTransport, transportFactory, protocolFactory);
错误三:
undefined reference to `rocksdb::Slice::ToString(bool)
解决三:
在Makefile文件中添加 -lrocksdb,Makefile文件改为:
include ../Makefile.config
EXECUTABLE = mapkeeper_rocksdb
all : thrift
g++ -Wall -o $(EXECUTABLE) *cpp -I $(THRIFT_DIR)/include/thrift -I $(THRIFT_DIR)/include \
/usr/local/lib/libleveldb.a /usr/local/lib/libsnappy.a -lrocksdb -lpthread -lboost_thread -lboost_system -lboost_filesys
tem -lthrift -lleveldb -I ../thrift/gen-cpp \
-L $(THRIFT_DIR)/lib \
-L ../thrift/gen-cpp -lmapkeeper \
-Wl,-rpath,\$$ORIGIN/../thrift/gen-cpp \
-Wl,-rpath,$(THRIFT_DIR)/lib \
-std=c++11
thrift:
make -C ../thrift
run:
./$(EXECUTABLE) --sync
clean :
-rm -rf $(THRIFT_SRC) $(EXECUTABLE) *.o
wipe:
-rm -rf data/*
最后执行 :
make
生成 mapkeeper_rocksdb表示make成功。