一 GRPC

GRPC 是一个高性能、开源、通用的RPC框架,由Google推出,基于HTTP2协议标准设计开发,默认采用Protocol Buffers数据序列化协议,支持多种开发语言。 gRPC提供了一种简单的方法来精确的定义服务,并且为客户端和服务端自动生成可靠的功能库。

项目中需要使用GRPC,所以决定使用源码形式cmake进行安装,本来以为是挺简单的事情,结果忙活了半天,所以记录下相关的安装过程,防止以后再次编译的时候踩坑。

二、GRPC源码和相关子模块

首先,我们从github下载GRPC的源代码以及相关子模块的代码,这步可能出现失败或者网速慢的情况,多执行几次直到完全下载完毕为止,并且通过submodule的方式递归下载依赖的子模块,这个步骤需要把所有的依赖模块下载完整,方便以后的使用。

git clone https://github.com/grpc/grpc.git
cd grpc
git submodule update --init --recuresive

三、编译安装Protobuf

这个步骤编译安装Protocol,通过递归下载的子项目进行编译,GRPC的通信里面都是pb的格式,谷歌家的产品基本都是依赖pb,包括大名鼎鼎的Tensorflow都是如此。

[root@localhost grpc]# cd third_party/protobuf/
[root@localhost protobuf]# ./autogen      
[root@localhost protobuf]# ./configure
[root@localhost protobuf]# make
[root@localhost protobuf]# make install
[root@localhost protobuf]# ldconfig # refresh shared library cache.
[root@localhost protobuf]# which protoc/usr/local/bin/protoc
[root@localhost protobuf]# protoc --version
libprotoc 3.18.1

四、编译安装gRPC

1 GCC版本

  1. 直接编译GRPC,出现如下错误,所

错误:对‘StrFormat(const char [45], const double&, double, const double&, const double&)’的调用没有匹配的函数

  1. 同时经过查找资料,最终查到如下Issue,原因是gcc版本的问题,以可以对照下上面的图表,编译需要GCC的特定的版本,需要4.9+。

https://github.com/grpc/grpc/issues/24940

you need gcc version 4.9+. https://grpc.io/docs/

These are the officially supported gRPC language, platform and OS versions:

Language

OS

Compilers / SDK

C/C++

Linux, Mac

GCC 4.9+, Clang 3.4+

C/C++

Windows 7+

Visual Studio 2015+

C#

Linux, Mac

.NET Core, Mono 4+

C#

Windows 7+

.NET Core, NET 4.5+

Dart

Windows, Linux, Mac

Dart 2.12+

Go

Windows, Linux, Mac

Go 1.13+

Java

Windows, Linux, Mac

JDK 8 recommended (Jelly Bean+ for Android)

Kotlin

Windows, Linux, Mac

Kotlin 1.3+

Node.js

Windows, Linux, Mac

Node v8+

Objective-C

macOS 10.10+, iOS 9.0+

Xcode 7.2+

PHP

Linux, Mac

PHP 7.0+

Python

Windows, Linux, Mac

Python 3.5+

Ruby

Windows, Linux, Mac

Ruby 2.3+

  1. 于是升级GCC版本,采用源码安装(由于大家都知道的原因),采用了一些预下载包的方式
  • wget https://mirrors.sjtug.sjtu.edu.cn/gnu/gcc/gcc-4.9.4/gcc-4.9.4.tar.gz
  • 解压缩,然后执行 ./contrib/download_prerequisites,但是由于网络原因,所以自动下载的五个依赖包无法下载,所以从其他的地方下载,然后放置到根目录。所以需要修改文件,将其中的五个 wget 行注释掉,注意:把 mpc 的版本修改成 1.0.3。
  • 五个依赖包的下载地址:https://github.com/dubaokun/code/blob/master/engine/net/gcc%E5%8D%87%E7%BA%A74.9.4%E5%8C%85.rar,分别是:cloog-0.18.1.tar.gz、gmp-4.3.2.tar.bz2、isl-0.12.2.tar.bz2、mpc-1.0.3.tar.gz、mpfr-2.4.2.tar.bz2,将这五个源码包移动到 gcc 根目录,并执行./contrib/download_prerequisites
  • ./configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
  • make -j4
  • make install
  • 然后为了使新装的gcc生效,进行如下操作
rm -rf /usr/bin/cc
ln -s /usr/local/bin/gcc /usr/bin/cc
rm -rf /usr/bin/c++
ln -s /usr/local/bin/g++ /usr/bin/c++

2 升级cmake(需要3.0以上的版本)

$ wget -q -O cmake-linux.sh https://github.com/Kitware/CMake/releases/download/v3.17.0/cmake-3.17.0-Linux-x86_64.sh
$ sh cmake-linux.sh -- --skip-license --prefix=/usr
$ rm cmake-linux.sh
$ mkdir -p cmake/build
$ cd cmake/build
$ cmake ../..
$ make

3 `CXXABI_1.3.8’ not found错误解决

  • 编译报错
ImportError: /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found
  • 然后,我们查询下,看看是什么情况,看看这个动态库的情况
strings /lib64/libstdc++.so.6 | grep CXXABI
CXXABI_1.3
CXXABI_1.3.1
CXXABI_1.3.2
CXXABI_1.3.3
CXXABI_1.3.4
CXXABI_1.3.5
CXXABI_1.3.6
CXXABI_1.3.7
CXXABI_TM_1
  • 查询系统上所有的libstdc++.so动态库
find / -name "libstdc++.so*"
/home/dubaokun/tools/GCC/gcc-4.9.4/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.20
/home/dubaokun/tools/GCC/gcc-4.9.4/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/home/dubaokun/tools/GCC/gcc-4.9.4/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/home/dubaokun/tools/GCC/gcc-4.9.4/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.20
/home/dubaokun/tools/GCC/gcc-4.9.4/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/home/dubaokun/tools/GCC/gcc-4.9.4/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/home/dubaokun/tools/GCC/gcc-4.9.4/prev-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.20
/home/dubaokun/tools/GCC/gcc-4.9.4/prev-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/home/dubaokun/tools/GCC/gcc-4.9.4/prev-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
find: ‘/proc/27162’: 没有那个文件或目录
find: ‘/proc/27163’: 没有那个文件或目录
find: ‘/run/user/1000/gvfs’: 权限不够
/usr/lib/debug/usr/lib/gcc/x86_64-redhat-linux/4.8.2/libstdc++.so.debug
/usr/lib/debug/usr/lib64/libstdc++.so.6.0.19.debug
/usr/lib/debug/usr/lib64/libstdc++.so.6.debug
/usr/lib/debug/usr/lib64/libstdc++.so.debug
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/32/libstdc++.so
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/libstdc++.so
/usr/lib64/libstdc++.so.6
/usr/lib64/libstdc++.so.6.0.19
/usr/lib64/libstdc++.so.6.0.20
/usr/lib64/libstdc++.so.6_bak
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.py
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyc
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyo
/usr/local/lib64/libstdc++.so.6.0.20
/usr/local/lib64/libstdc++.so.6
/usr/local/lib64/libstdc++.so
/usr/local/lib64/libstdc++.so.6.0.20-gdb.py
  • 查看我们刚刚安装的新的4.9.4的版本
strings /home/dubaokun/tools/GCC/gcc-4.9.4/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.20 |grep CXXABI
CXXABI_1.3
CXXABI_1.3.1
CXXABI_1.3.2
CXXABI_1.3.3
CXXABI_1.3.4
CXXABI_1.3.5
CXXABI_1.3.6
CXXABI_1.3.7
CXXABI_1.3.8
CXXABI_TM_1
CXXABI_1.3
CXXABI_1.3.2
CXXABI_1.3.6
CXXABI_1.3.1
CXXABI_1.3.5
CXXABI_1.3.8
CXXABI_1.3.4
CXXABI_TM_1
CXXABI_1.3.7
CXXABI_1.3.3
  • 复制动态库:
cp /home/dubaokun/tools/GCC/gcc-4.9.4/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.20 /usr/lib64/
  • 改变软连接的指向
sudo rm libstdc++.so.6
sudo ln -s libstdc++.so.6.0.20 libstdc++.so.6

五、Demo测试

  • helloworld/Build
cmake..
出现:
CMake Error at /home/dubaokun/opensource/GRPC/grpc/examples/cpp/cmake/common.cmake:101 (find_package):
  Could not find a package configuration file provided by "Protobuf" with any
  of the following names:

    ProtobufConfig.cmake
    protobuf-config.cmake
  • 重新编译Protobuf
cd third_party/protobuf
cd cmake/build
cmake -Dprotobuf_BUILD_TESTS=OFF ..
make 
make install
  • 然后继续编译例子,但是出现如下问题
CMake Error at CMakeLists.txt:116 (find_package):
  Could not find a package configuration file provided by "gRPC" with any of
  the following names:

    gRPCConfig.cmake
    grpc-config.cmake
  • 继续重新编译grpc
在grpc/cmake/build目录下
cmake ../../
make -j4
make install
  • 然后,继续camke …; make
  • 成功

grafana源码变成rpm grpc 源码_docker