您的位置:首页 > 运维架构 > Linux

Linux上搭建百度brpc框架

2017-11-12 15:28 211 查看
由于平常用的rpc都是用thrift,百度开源brpc后想知道两者的差异是什么,所以就急切的从github上下载研究研究,发现文档写的是真的好~~当然还有里面的例子。研究了几天后,想搭好环境实现一波,搭好之后想把过程遇到的坑分享出来~

随便说下,我的是centos7的版本,ubutun也差不多。

一、brpc依赖三个开源库:是gflags,protobuf和leveldb。gflags是用于像Linux命令行那样指定参数的,protobuf用于序列和反序列化以及它的 rpc定义。leveldb用来压缩的。

1:安装gflags。使用命令 git clone https://github.com/gflags/gflags.git 下载好源文件,cd进入目录。然后根据以下步骤:

mkdir build && cd build
cmake ..
make
make install


这里会有一个问题,这样生成的gflags库是生成静态库,即libgflags.a和libgflags_nothreads.a,但编译brpc时需要的是gflags的动态库!用静态库编译brpc会出现以下错误(stackoverflow上还说下述这种错误是因为命名空间改了的原因):

/usr/bin/ld: /usr/local/lib/libgflags.a(gflags.cc.o): relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libgflags.a: error adding symbols: Bad value
clang: error: linker command failed with exit code 1 (use -v to see invocation)


所以需要把gflags生成动态库!生成动态库的方法从网上找了很久,几乎都是说上面那种方法但我一直生成不了动态库,最后找到了一个方法,可以生成gflags动态库和更改命名空间,解决!:

mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_SHARED_LIBS=ON -DGFLAGS_NAMESPACE=google ../<
4000
/span>
make
sudo make install


2:安装protobuf。这 个很简单,没遇到什么坑,只需要

git clone https://github.com/google/protobuf.git

然后 :

./autogen.sh
./configure
$ make
$ make check
$ sudo make install


会生成动态和静态库,头文件在/usr/local/include,库文件在/usr/local/lib

3:安装leveldb。先下载源文件:

git clone https://github.com/google/leveldb.git

进入目录:

make


只需要make命令,会生成两个文件夹,一个是out-shared文件夹里边是动态库,另一个是out-static文件夹里面是静态库。

brpc编译时也是用的leveldb的动态库!不是静态库,需要把out-shared里的.so文件拷贝到/usr/local/lib(因为喜欢把开源库拷贝到这个文件夹。。。)。

否则会出现以下错误:

/usr/bin/ld: /usr/local/lib/libleveldb.a(db_impl.o): relocation R_X86_64_32S against `_ZTVN7leveldb2DBE' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libleveldb.a: error adding symbols: Bad value
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [libbrpc.so] Error 1


二、前面把brpc三个依赖的库环境搭好啦,接下来就是编译brpc了,后面就简单了:

sh config_brpc.sh --headers=/usr/local/include --libs=/usr/local/lib --cxx=clang++ --cc=clang --nodebugsymbols
make


到这一步就结束啦,会在目录生成一个output文件夹,里有三个文件夹:bin 、include 和lib,里面包含着头文件和库文件,可以直接用啦。bin里面包含着文件 现在还不知道,正在学习中~~,如下图:



以echo_c++为例来使用brpc库:

1:首先通过protoc来编译.proto文件。

protoc --cpp_out=. echo.proto


会在本目录下生成echo.pb.h和echo.pb.cc文件。

2:client.cpp和server.cpp里需要改下命名空间,原代码里是:

GFLAGS_NS::ParseCommandLineFlags(&argc, &argv, true);


改成:

google::ParseCommandLineFlags(&argc, &argv, true);


3:CMakeLists.txt内容:

cmake_minimum_required(VERSION 2.4.1)

set (INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src
/usr/local/include
/yingongjun/myshare/opensoure/output/include)
set(LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib
/usr/local/lib
/yingongjun/myshare/opensoure/output/lib)

add_compile_options(-std=c++11 -g)

include_directories(${INCLUDE_DIR})
link_directories(${LIB_DIR})

add_executable(client client.cpp echo.pb.h echo.pb.cc)
add_executable(server server.cpp echo.pb.h echo.pb.cc)

target_link_libraries(client
-lgflags
-lbrpc
-lprotobuf
-lleveldb
)

target_link_libraries(server
-lgflags
-lbrpc
-lprotobuf
-lleveldb
)
set_target_properties(client PROPERTIES LINK_FLAGS -Wl,-rpath=/usr/local/lib)


4:然后

cmake
make client
make server


就可以了,然后运行./client和./server即可。运行效果:

服务端:



客户端:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: