https://github.com/grpc/grpc/blob/master/BUILDING.md 官方教程
https://github.com/grpc/grpc/releases/tag/v1.34.0 release 版本
cmake 需要1.10版本以上
RELEASE_TAG_HERE 为你需要的 release 版本,我这里用的是 v1.34.0
由于项目比较大, 下载速度比较慢, 还经常失败,我选择下载 zip, 然后传到我的云服务器上
git submodule update --init 会下载 .gitmodules 中的依赖包,由于网络原因,仍然采用手动下载传到云服务上的方式
- 对于不需要的语言,CMakeLists.txt 可以注释掉:
- 依赖包可以查看 grpc 的 CMakeLists.txt , 会根据 xxxx.cmake 查找依赖
- 换成了 cares-17 有CMakeLists.txt https://github.com/c-ares/c-ares/releases/tag/cares-1_17_1 , 无需手动安装
- 可以修改依赖库的路径,比如 protobuf.cmake 中,我的安装包路径不在thirdpart下
- 在 grpc/cmake/ 创建 build 目录, cmake ../.. ,注意报的错误,对于缺少的依赖库都需要安装,我们可以手动下载它们的 zip ,解压后将源文件放在相应 grpc/thirdpart 目录下,比如 cp -r re2-master/* grpc/thirdpart/re2 (或者修改xxx.cmake 的路径)
- 对于已经手动安装的库,我们可以设置 -Dxxxx=package,依赖库的 cmake/xxx.cmake 中会 find_package, 比如 -DgRPC_SSL_PROVIDER=package;(默认为module,会从thirdpart下安装)
# NOTE: all of gRPC's dependencies need to be already installed
$ cmake ../.. -DgRPC_INSTALL=ON \
-DCMAKE_BUILD_TYPE=Release \
-DgRPC_ABSL_PROVIDER=package \
-DgRPC_CARES_PROVIDER=package \
-DgRPC_PROTOBUF_PROVIDER=package \
-DgRPC_RE2_PROVIDER=package \
-DgRPC_SSL_PROVIDER=package \
-DgRPC_ZLIB_PROVIDER=package
$ make
$ make install
- -DgRPC_ABSL_PROVIDER=module ,absl 从 thirdpart 下安装,否则会报 find_package error ,应该是我没有指定目录
- openssl 我是手动安装的,cmake 还需指定 ssl 目录(因为不在默认的/usr/local/lib下), cmake ../.. xxxxxxxxxxx(以上) -DOPENSSL_ROOT_DIR=/usr/local/ssl -DOPENSSL_LIBRARIES=/usr/local/ssl/lib , 否则链接失败会报错:
[ 4%] Linking CXX executable greeter_async_server
/usr/local/lib/libgrpc.a(json_token.cc.o): In function `grpc_auth_json_key_create_from_json(grpc_core::Json const&)':
json_token.cc:(.text+0x24e): undefined reference to `BIO_s_mem'
json_token.cc:(.text+0x256): undefined reference to `BIO_new'
json_token.cc:(.text+0x26d): undefined reference to `BIO_puts'
json_token.cc:(.text+0x2ce): undefined reference to `PEM_read_bio_RSAPrivateKey'
json_token.cc:(.text+0x32a): undefined reference to `BIO_free'
sudo make
sudo make install
HelloWorld 编译
进入 examples/cpp/helloworld/
mkdir build && cd build
cmake ..
make
运行 greeter_server 、greeter_client