(os: ubuntu 16.04)
1. 下载gRPC源码
1.1 git拉取
在网络可以连接到github的情况下, 只需要简单的一条命令就可以拉取到所有需要的源码
git clone --recurse-submodules -b v1.37.1 https://github.com/grpc/grpc
但是, 网络无法很顺畅的连接到github, 将拉取地址中的github.com替换成镜像站的网址 github.com.cnpmjs.org,如果此镜像站出现问题请重新搜索可用的镜像站地址。
1.2 submodule拉取
注意下面的git指令, 使用了--recurse-submodules, 会同时拉取该git项目依赖的submodule,
git clone --recurse-submodules -b v1.37.1 https://github.com/grpc/grpc
如果网络不佳,我们可手动替换了上面命令中的拉取地址, 如下所示
git clone --recurse-submodules -b v1.37.1 https://github.com.cnpmjs.org/grpc/grpc
但是此时submodule中的地址仍然是github.com, 没有经过替换, 所以此时拉取仍然会失败, 经过
网上检索到的信息, 提供一个解决方案, 先不拉取submodule, 使用如下的git命令
git clone -b v1.37.1 https://github.com.cnpmjs.org/grpc/grpc
成功拉取到代码后, 进入代码目录, 打开.gitmodules修改submodule地址, 替换所有github.com为 镜像地址(github.com.cnpmjs.org). 然后执行git submodule sync, 重新同步submodule的url.
上述操作成功之后执行以下命令
git submodule update --init
拉取submodule, 一切顺利的话gRPC相关的源码即全部拉取成功.
2. 编译gRPC代码
2.1 基础工具
2.1.1 cmake
截至(2021.5.19)官方文档要求需要cmake版本高于3.13. 可通过一下命令查看自己当前cmake的版本
cmake --version
如果不符合要求, 需要进行升级替换符合要求的版本, 此处不详细叙述如何升级cmake,提供一个供
参考的网址(https://askubuntu.com/questions/829310/how-to-upgrade-cmake-in-ubuntu).
下载cmake高版本:https://github.com/Kitware/CMake/releases/download/v3.20.2/cmake-3.20.2.tar.gz 后编译默认安装即可。
2.1.2 其他相关工具
执行以下命令就可以完成其他所需工具的安装
sudo apt install -y build-essential autoconf libtool pkg-config
必须确保这些工具安装成功,尤其是pkg-config ,否则后续编译案例 helloword 会出错。
2.2 开始编译
2.2.1 编译gRPC
为了方便后续操作, 先切换到超级用户然后进行操作, 执行以下命令切换到超级用户
sudo su
之后输入密码, 当@前面的符号显示为root之后说明成功切换到超级用户.
进入grpc代码目录
1、在当前目录执行make, 编译gRPC,再执行make install 进行默认安装
2、再进入third_party/protobuf 下执行./configure 生成makefile 后继续执行make 再次make install 默认安装即可。(这一步至关重要,将protobuf可执行程序,静动态库以及头文件安装到默认目录,保证编译example顺利进行)
2.2 测试程序检查
进入grpc代码目录, 进入helloworld测试程序目录,
cd examples/cpp/helloworld
进入到该目录下, 执行下面指令使用cmake 生成makefile
成功之后进行 make 编译, 当前目录会生成相应的服务端和客户端可执行程序
首先启动 greeter_server 进程, 然后另开一个终端启动 greeter_client,
当屏幕上出现 "Greeter received: Hello world" 说明成功
2.3 利用protobuf生成c++代码
protoc [proto file path] --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` --grpc_out=[output fold path]
protoc [proto file path] --cpp_out= [output fold path]