linux编译grpc
安装cmake
编译cmake 版本需3.13及以上版本
使用在线安装sudo apt install cmake
参看cmake 版本 cmake -version
下载地址:https://cmake.org/download/
可以直接下载二进制程序,或者下载源码编译安装。
程序或者源码地址:https://cmake.org/download/#older
如果是源码安装,那就是走解压缩、配置、编译、安装的4步。
后续就是建立软连接
sudo ln -s /home/shl/tools/cmake-3.30.1-Linux-x86_64/bin/cmake /usr/bin/cmake
最后就是cmake --version 查看是否安装或者升级成功
安装的其他必备组件
apt-get install build-essential autoconf libtool pkg-config
#如果你是grpc开发者还需安装以下组件
apt-get install libgflags-dev
apt-get install libgtest-dev
apt-get install clang libc++-dev
备注,(在这台电脑上,下面4个库都已经安装好了的)
##build-essential作用是提供编译程序必须软件包的列表信息,这样编译程序才知道头文件和库函数在哪,才会下载依赖的软件包
##autoconf是一种生成shell脚本的工具,可以自动配置软件源代码包
##libtool是自动生成并调用动态库的工具,包装了gcc或者其他编译器
##pkg-config提供功能:检查库的版本号;获得编译预处理参数,如宏定义、头文件的位置; 获得链接参数,如库及依赖的其他库的位置,文件名及其他一些链接参数;自动加入所依赖的其他库的设置。
环境变量配置
# 构建路径
export MY_INSTALL_DIR=/usr/local/grpc/ //具体哪个目录自定义
# 确保目录已存在
mkdir -p $MY_INSTALL_DIR
# 将本地bin目录增加到path环境变量中
export PATH=$PATH:$MY_INSTALL_DIR/bin
下载GRPC源码
下载地址:GitHub - grpc/grpc: The C based gRPC (C++, Python, Ruby, Objective-C, PHP, C#)
编译安装
- 把终端命令切换到grpc源码处 cd grpc源码
mkdir -p cmake/build
cd cmake/build
- 默认是生成静态库.a文件。如果想要编译动态库.so文件,运行cmake时添加-DBUILD_SHARED_LIBS=ON. 同时设置(静态库)动态库的输出路径(-DCMAKE_INSTALL_PREFIX=$MY_INSTALL_DIR)
cmake ../.. -DBUILD_SHARED_LIBS=ON \
-DgRPC_INSTALL=ON \
-DgRPC_BUILD_TESTS=OFF \
-DCMAKE_INSTALL_PREFIX=$MY_INSTALL_DIR \
设置第三方库的安装(两种方式,1.分别安装。2.自动安装),这里使用自动安装
如果想编译release版本,设置-DCMAKE_BUILD_TYPE=Release
cmake ../.. -DCMAKE_BUILD_TYPE=Release \
-DgRPC_ABSL_PROVIDER=module \
-DgRPC_CARES_PROVIDER=module \
-DgRPC_PROTOBUF_PROVIDER=module \
-DgRPC_RE2_PROVIDER=module \
-DgRPC_SSL_PROVIDER=module \
-DgRPC_ZLIB_PROVIDER=module
这样完成的cmake命令如下:
cmake ../.. -DBUILD_SHARED_LIBS=ON \
-DgRPC_INSTALL=ON \
-DgRPC_BUILD_TESTS=OFF \
-DCMAKE_INSTALL_PREFIX=$MY_INSTALL_DIR \
-DCMAKE_BUILD_TYPE=Release \
-DgRPC_ABSL_PROVIDER=module \
-DgRPC_CARES_PROVIDER=module \
-DgRPC_PROTOBUF_PROVIDER=module \
-DgRPC_RE2_PROVIDER=module \
-DgRPC_SSL_PROVIDER=module \
-DgRPC_ZLIB_PROVIDER=module
注解:
这里MY_INSTALL_DIR是环境变量设置的。
DCMAKE_BUILD_TYPE=Release 表示编译出release版本库
如果想编译出debug版本,则DCMAKE_BUILD_TYPE=Debug
DBUILD_SHARED_LIBS=ON 表示编译出动态库,
如果想编译出静态库,则直接去掉DBUILD_SHARED_LIBS=ON
DgRPC_SSL_PROVIDER=module 表示直接使用grpc的third_party的源码编译。
- make -j
//多核编译 如make -j4
- make install
备注:
mkdir -p 选项确保了指定的整个目录路径都会被创建。
cmake 生成构建文件(如makefile)
处理proto文件
可以直接使用windows版本的proto文件及生成的pb、grpc.pb文件。当然也可以在linux自己使用命令生成pb、grpc.pb文件。
.pb.h:声明生成的消息类的头文件
.pb.cc:包含消息类的实现
.grpc.pb.h:声明生成的服务类的头文件
.grpc.pb.cc:包含服务类的实现
先配置环境变量
一样要使用到protoc软件,则需要在环境变量PATH增加protoc软件所在的目录,同时由于protoc软件需要用到grpc的动态库,所以需要设置环境变量LD_LIBRARY_PATH,增加grpc动态库目录。如下:
export PATH=/root/study/grpc/grpc/bin:$PATH
export LD_LIBRARY_PATH=/root/study/grpc/grpc/lib/debug:$LD_LIBRARY_PATH
再终端输入命令
protoc --cpp_out=./ ./helloworld.proto
protoc --grpc_out=./ --plugin=protoc-gen-grpc=/root/study/grpc/grpc/bin/grpc_cpp_plugin helloworld.proto
注解:
protoc:解析proto文件并根据给定的选项生成输出,其命令格式是protoc [OPTION] PROTO_FILES,最后一项是待编译的proto文件的位置
–cpp_out:指定.pb.cc和.pb.h文件的输出目录
--grpc_out:指定.grpc.pb.cc和.grpc.pb.h文件的输出目录
--plugin:指定要使用的插件可执行文件。可执行文件的形式是名称=路径,在这种情况下给定的插件名称映射到给定的可执行文件。
grpc_cpp_plugin是grpc的protoc插件
配置依赖库
前提:把编译好的grpc放在/usr/local目录下
可以使用pkg-config --libs protobuf grpc++ 查看依赖包关系,这里得到
root@glh-kylin:/usr/local# pkg-config --libs protobuf grpc++
-L/usr/local/grpc/lib -lprotobuf -lpthread -lgrpc++ -lgrpc -laddress_sorting -lre2 -lupb -lcares -lz -lgpr -lssl -lcrypto -labsl_raw_hash_set -labsl_hashtablez_sampler -labsl_exponential_biased -labsl_hash -labsl_city -labsl_wyhash -labsl_statusor -labsl_status -labsl_cord -labsl_bad_optional_access -labsl_str_format_internal -labsl_synchronization -labsl_graphcycles_internal -labsl_stacktrace -labsl_symbolize -labsl_debugging_internal -labsl_demangle_internal -labsl_malloc_internal -labsl_time -labsl_civil_time -labsl_strings -labsl_strings_internal -lrt -labsl_base -labsl_spinlock_wait -labsl_int128 -labsl_throw_delegate -labsl_time_zone -labsl_bad_variant_access -labsl_raw_logging_internal -labsl_log_severity
依赖库介绍
项目时需要链接的依赖库:
grpc++:gRPC的C++库。
grpc_unsecure:不安全的传输层实现。
gpr:gRPC的基础运行时库。
address_sorting:一个用于IPV6的辅助库。
cares:c-ares异步解析库。
absl_synchronization:来自Abseil的同步库。
absl_time:来自Abseil的时间库。
absl_strings:来自Abseil的字符串库。
upb:Protocol Buffers的微型边界(micro border)运行时库。
protobuf:Protocol Buffers库。
你可能还需要z库,如果你的gRPC使用了zlib。