Linux上搭建百度brpc框架

来源:互联网 发布:自定义 仅安装windows 编辑:程序博客网 时间:2024/06/05 10:42

由于平常用的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 valueclang: error: linker command failed with exit code 1 (use -v to see invocation)

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

mkdir build && cd buildcmake -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_SHARED_LIBS=ON -DGFLAGS_NAMESPACE=google ../ 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 valueclang: 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 --nodebugsymbolsmake

到这一步就结束啦,会在目录生成一个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:然后

cmakemake clientmake server

就可以了,然后运行./client和./server即可。运行效果:
服务端:
这里写图片描述

客户端:
这里写图片描述

原创粉丝点击