ubuntu18下grpc编译与安装

grpc装起来很麻烦,会有很多坑。按照官方文档或者其他博客的步骤,不注意依赖库的版本页会导致各种问题。

0. 环境

在 https://grpc.io/docs/ grpc的环境依赖如下

Language OS Compilers / SDK
C/C++ Linux, Mac GCC 4.9+, Clang 3.4+
0.1 操作系统Ubuntu 18.04.4 LTS (腾讯云的虚拟机)

坑1:为了支持cpp11,gcc版本要4.9+,所以一些比较老的系统比如centos7.6,gcc默认4.8.5,是要升级gcc/g++的。升级gcc有两种方式

  • 编译安装,耗时长,软连接和libc的库需要手动更新,不推荐。
  • 使用centos-release-scl安装gcc, 升级方便快速
[root@VM-0-16-centos ~]# yum install centos-release-scl
[root@VM-0-16-centos ~]# yum install devtoolset-8-gcc*
[root@VM-0-16-centos ~]# scl enable devtoolset-8 bash
[root@VM-0-16-centos ~]# gcc -v
....
gcc version 4.9.0 (GCC) 

如果系统环境对自己不存在束缚,那么推荐直接上Ubuntu18,gcc目前版本是7.5,能够对开发有个良好的支撑,不用考虑兼容问题。

0.2 cmake版本

坑2:Ubuntu18 通过apt方式安装cmake的版本是 3.10.2。对grpc来说,太低了。所以我们直接安装目前的最高版本。
cmake3.20 目前是最新版本,方法如下
坑3: 如果wget慢的像乌龟,那么可以考虑用windows迅雷下载,然后导入linux系统中。如果系统中低版本的cmake,先卸载掉

wget https://cmake.org/files/v3.20/cmake-3.20.0-rc1-linux-x86_64.sh
cmake-3.20.0-rc1-linux-x86_64.sh --prefix=/usr/local --exclude-subdir
0.3 安装zlib

方法如下

wget http://www.zlib.net/zlib-1.2.11.tar.gz
tar -xvf zlib-1.2.11.tar.gz
cd zlib-1.2.11/
./configure
make
sudo make install

这一步如果不安装后面make编译会报zlib.h找不到

1. 复制代码库

坑4:直接从github上拉仓库会奇慢无比,最好用gitee倒一下。自己倒腾也行,用下面我的gitee也行。见本文最后.gitmodules 。

2. 拉取grpc ,指定版本v1.12.0

坑5:新版本我试了好几次,make那一步总出错,而且越补越漏。

git clone https://gitee.com/niubucai/grpc.git
cd grpc/ 
git tag 
git checkout v1.12.0
git submodule sync 
git submodule update --init

3. 单独安装protoc

将protoc更新到v3.6.1 make -j4是多和编译,-j后面的参数根据当前系统配置加快编译

cd third_party/protobuf
git tag
git checkout v3.6.1
./autogen.sh 
./configure
sudo make -j4
sudo make install
sudo ldconfig     
protoc --version  

4. 编译安装grpc 加参数 HAS_SYSTEM_PROTOBUF=false

cd ../../ # 这里是grpc的目录
make HAS_SYSTEM_PROTOBUF=false 
sudo make install 

注意修改下.gitmodules文件,内容如下,如果自己从GitHub上复制了这些库,也可以用自己的拷贝。

5. 测试helloworld

终端1:
ubuntu@VM-0-16-ubuntu:~/grpc$ cd examples/cpp/helloworld/
ubuntu@VM-0-16-ubuntu:~/grpc/examples/cpp/helloworld$ ./greeter_server 
Server listening on 0.0.0.0:50051
终端2:
ubuntu@VM-0-16-ubuntu:~/grpc/examples/cpp/helloworld$ ./greeter_client 
Greeter received: Hello world

附录

.gitmodules 文件

[submodule "third_party/zlib"]
        path = third_party/zlib
        url = https://gitee.com/niubucai/zlib.git
        # When using CMake to build, the zlib submodule ends up with a
        # generated file that makes Git consider the submodule dirty. This
        # state can be ignored for day-to-day development on gRPC.
        ignore = dirty
[submodule "third_party/protobuf"]
        path = third_party/protobuf
        url = https://gitee.com/niubucai/protobuf.git
[submodule "third_party/googletest"]
        path = third_party/googletest
        url = https://gitee.com/niubucai/googletest.git
[submodule "third_party/benchmark"]
        path = third_party/benchmark
        url = https://gitee.com/niubucai/benchmark
[submodule "third_party/boringssl"]
        path = third_party/boringssl
        url = https://gitee.com/niubucai/boringssl.git
[submodule "third_party/boringssl-with-bazel"]
        path = third_party/boringssl-with-bazel
        url = https://gitee.com/niubucai/boringssl.git
[submodule "third_party/re2"]
        path = third_party/re2
        url = https://gitee.com/niubucai/re2.git
[submodule "third_party/cares/cares"]
        path = third_party/cares/cares
        url = https://gitee.com/niubucai/c-ares.git
        branch = cares-1_12_0
[submodule "third_party/bloaty"]
        path = third_party/bloaty
        url = https://gitee.com/niubucai/bloaty.git
[submodule "third_party/abseil-cpp"]
        path = third_party/abseil-cpp
        url = https://gitee.com/niubucai/abseil-cpp.git
        branch = lts_2020_02_25
[submodule "third_party/envoy-api"]
        path = third_party/envoy-api
        url = https://gitee.com/niubucai/data-plane-api.git
[submodule "third_party/googleapis"]
        path = third_party/googleapis
        url = https://gitee.com/niubucai/googleapis.git
[submodule "third_party/protoc-gen-validate"]
        path = third_party/protoc-gen-validate
        url = https://gitee.com/niubucai/protoc-gen-validate.git
[submodule "third_party/udpa"]
        path = third_party/udpa
        url = https://gitee.com/niubucai/udpa.git
[submodule "third_party/libuv"]
        path = third_party/libuv
        url = https://gitee.com/niubucai/libuv.git
[submodule "third_party/opencensus-proto"]
        path = third_party/opencensus-proto
        url = https://gitee.com/niubucai/opencensus-proto.git
[submodule "third_party/gflags"]
        path = third_party/gflags
        url = https://gitee.com/niubucai/gflags.git

文章参考
[1] https://blog.csdn.net/qq_32460819/article/details/114708740
[2] https://grpc.io/docs/guides/

猜你喜欢

转载自blog.csdn.net/niu91/article/details/114995147
今日推荐