一 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版本
- 直接编译GRPC,出现如下错误,所
错误:对‘StrFormat(const char [45], const double&, double, const double&, const double&)’的调用没有匹配的函数
- 同时经过查找资料,最终查到如下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+ |
- 于是升级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
-
成功