说明
安装 gRPC 需要首先安装基础工具如 cmake、git、gcc等不再赘述
三方依赖包含:abseil -> protobuf + re2 + zlib + boringssl + c-ares -> grpc,需要安装
不同于网上大多使用 module 的方式编译,这里尽量使用 package 的模式编译安装,可以让安装所需空间更小,减少重复安装的组件。
此外,安装 gRPC 时需要下载一些三方组件,使用 gRPC 脚本自动下载的时候经常下载失败。这时可以自行下载三方依赖库代码,然后在安装 gRPC 时单独指定三方库的源代码路径。
编译具体步骤
-
abseil
$ git clone https://github.com/abseil/abseil-cpp.git $ cd abseil-cpp # -DBUILD_TESTING=OFF - 不编译测试程序以减少编译时间 # -DCMAKE_CXX_FLAGS=-fPIC - 添加-fPIC告诉编译器产生与位置无关代码,否则编译出的静态库无法在别的项目中连接成动态库 # -DABSL_USE_GOOGLETEST_HEAD=OFF - 不编译googletest相关代码 # -DABSL_PROPAGATE_CXX_STD=ON - 提示说是为了后向兼容,加上这句就没有报警了 # -DCMAKE_INSTALL_PREFIX=/usr/local/absl 添加自定义的安装地址,加上这种地址会更方便卸载。卸载的时候直接删除该目录就好了 $ cmake -S. -Bbuild -DBUILD_TESTING=OFF -DCMAKE_CXX_FLAGS=-fPIC -DABSL_USE_GOOGLETEST_HEAD=OFF -DABSL_PROPAGATE_CXX_STD=ON -DCMAKE_INSTALL_PREFIX=/usr/local/absl # -j后面跟随的数字可以和CPU核数保持一致以开启多核编译。如果编译过程中报错,可能是编译同步的bug,此时再降低核数可以通过。这里选择4进程编译。 $ cmake --build build -j4 $ cmake --install build # 由于使用了自定义的安装地址,所以需要在系统文件中给PATH添加相应路径。否则其他项目链接库的时候会找不到。 $ vim ~/.bashrc # 打开文件后输入 export ABSL_ROOT=/usr/local/absl # 修改PATH为 PATH=$ABSL_ROOT/lib64:$PATH -
protobuf
$ git clone https://github.com/protocolbuffers/protobuf.git $ cd protobuf # 最新的 v27.0 版本编译报错,用这个 v26.1 tag可以编译通过 $ git checkout tags/v26.1 # -Dprotobuf_BUILD_TESTS=OFF - 不编译测试文件 # -Dprotobuf_BUILD_SHARED_LIBS=OFF - 不编译动态库(我个人不需要这个,需要动态库的话可以不加该选项) # -Dprotobuf_ABSL_PROVIDER=package - 使用刚才编译好的库,不使用项目额外拉取的代码,详细点的原因可以看文末参考资料[1] # -DCMAKE_INSTALL_PREFIX=/usr/local/protobuf - 添加自定义的安装地址,原因同absl $ cmake -S. -Bbuild -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_BUILD_SHARED_LIBS=OFF -Dprotobuf_ABSL_PROVIDER=package -DCMAKE_INSTALL_PREFIX=/usr/local/protobuf # -j后面跟随的数字可以和CPU核数保持一致以开启多核编译。如果编译过程中报错,可能是编译同步的bug,此时再降低核数可以通过。这里选择4进程编译。 $ cmake --build build -j4 $ cmake --install build # 由于使用了自定义的安装地址,所以需要在系统文件中给PATH添加相应路径。protobuf用的是可执行文件,所以只添加 bin 目录就好了 $ vim ~/.bashrc # 打开文件后输入 export PROTOBUF_ROOT=/usr/local/protobuf # 修改PATH为 PATH=$ABSL_ROOT/lib64:$PROTOBUF_ROOT/bin:$PATH -
re2
$ git clone https://github.com/google/re2.git $ cd re2 # 该库比较基础,很多项目都会用,额外指定目录的话后续链接会比较麻烦。另外这个三方库内容少,卸载不难,所以直接使用默认目录了。 $ cmake -S. -Bbuild # 编译不存在什么同步问题,直接编译内核开到最大 $ cmake --build build -j8 $ cmake --install build -
zlib
$ git clone https://github.com/madler/zlib.git $ cd zlib # 该库比较基础,很多项目都会用,额外指定目录的话后续链接会比较麻烦。另外这个三方库内容少,卸载不难,所以直接使用默认目录了。 $ cmake -S. -Bbuild # 编译不存在什么同步问题,直接编译内核开到最大 $ cmake --build build -j8 $ cmake --install build -
grpc
$ git clone https://github.com/grpc/grpc.git $ cd grpc $ cd third_party && git submodule update --init # boringssl 和 c-ares 在下载的时候有点问题,这里选择手动额外下载 $ git clone https://github.com/google/boringssl.git && git clone https://github.com/c-ares/c-ares.git # -DgRPC_INSTALL=ON - 不知道作用,不过既然需要安装grpc,这个选项就加上 # -DgRPC_BUILD_TESTS=OFF - 不便宜测试程序,加快编译 # -DgRPC_ABSL_PROVIDER=package - 使用之前安装的absl库 # -DABSL_PROPAGATE_CXX_STD=ON - 提示说是为了后向兼容,加上这句就没有报警了 # -DgRPC_PROTOBUF_PROVIDER=package - 使用之前安装的protobuf库 # -DgRPC_RE2_PROVIDER=package - 使用之前安装的re2库 # -DBORINGSSL_ROOT_DIR=boringssl - 指定boringssl的源代码目录为刚刚下载的代码目录 # -DCARES_ROOT_DIR=c-ares - 指定c-ares的源代码目录为刚刚下载的代码目录 # -DgRPC_ZLIB_PROVIDER=package - 使用之前安装的zlib库 # -DCMAKE_INSTALL_PREFIX=/usr/local/grpc - grpc安装的内容非常多,如果使用默认地址安装grpc,卸载的时候非常麻烦,所以这里指定一个自定义路径。直接删除这个目录就可以无痕卸载grpc。 # -Wno-dev - 减少编译时候其他报警 $ cmake -S. -Bbuild -DgRPC_INSTALL=ON -DgRPC_BUILD_TESTS=OFF -DgRPC_ABSL_PROVIDER=package -DABSL_PROPAGATE_CXX_STD=ON -DgRPC_PROTOBUF_PROVIDER=package -DgRPC_RE2_PROVIDER=package -DgRPC_ZLIB_PROVIDER=package -DBORINGSSL_ROOT_DIR=boringssl -DCARES_ROOT_DIR=c-ares -DCMAKE_INSTALL_PREFIX=/usr/local/grpc -Wno-dev # 编译的时候我先开到最大核数编译,出错的时候再一次次尝试降低编译核数。大概在26%的时候报错,然后改成 -j2,过了一会儿又改成了 -j1 $ cmake --build build -j8 $ cmake --install build # 由于使用了自定义的安装地址,所以需要在系统文件中给PATH添加相应路径。 $ vim ~/.bashrc # 打开文件后输入 export GRPC_ROOT=/usr/local/grpc # 修改PATH为 export PATH=$ABSL_ROOT/lib64:$GRPC_ROOT:$PROTOBUF_ROOT/bin:$PROTOBUF_ROOT/lib:$PROTOBUF_ROOT/lib64:$PATH
验证
在gRPC代码中包含可供测试的代码
$ cd examples/cpp/helloworld
$ cmake -S. -Bbuild
$ cmake --build build -j4
$ cd build
$ ./greeter_async_server
# 在另一终端
$ ./greeter_async_client
参考资料
- gRPC交叉编译之第三方package模式, https://blog.csdn.net/u012385733/article/details/124430019
- Quick start, https://grpc.io/docs/languages/cpp/quickstart/
浙公网安备 33010602011771号