前言
本文根据grpc.io/docs/langua... grpc的安装与测试用例运行,并给出了个人C++项目中依赖grpc示例。如果不想自己编译,可以直接看 个人C++项目中依赖grpc示例编译运行 一节,给出了我个人编译好的grpc以及示例代码编译运行方法。水平不高,能力有限,错漏之处,还请见谅。欢迎友好讨论。
环境说明
本文所有操作是在2核2G,操作系统发行版本为CentOS 7.6 的腾讯云机器上进行的。

各个软件版本:
- CMake版本:4.2.0,安装过程可在 C++ grpc安装 一节找到
- Git版本:2.25.0,安装过程可在 C++ grpc安装 一节找到
- GCC版本:gcc 11.2,安装过程可在 C++ grpc安装 一节找到
- GLIBCXX 版本:libstdc++.so.6.0.29(伴随gcc11.2安装),设置过程可在 C++ grpc helloworld示例程序运行 一节找到
- as & ld版本: 2.45,安装过程可在 C++ grpc安装 一节找到
C++ grpc安装
设置安装路径
shell
# 安装流程
export MY_INSTALL_DIR=/home/xxxxxx/blog_code/grpc # 设置安装路径, 设置一个本地路径, 避免卸载困难
mkdir -p $MY_INSTALL_DIR # 确保安装路径存在
确保CMake版本够新
按照 grpc.io/docs/langua... 中的要求,CMake版本要大于3.16版本。可以执行指令
shell
cmake --version
查看。我的本机版本是2.8.12.2,所以要更新为较新版本。
在 grpc.io/docs/langua... 中给出了更新到3.30版本的指令,如下:
shell
wget -q -O cmake-linux.sh https://github.com/Kitware/CMake/releases/download/v3.30.3/cmake-3.30.3-linux-x86_64.sh
sh cmake-linux.sh -- --skip-license --prefix=$MY_INSTALL_DIR
rm cmake-linux.sh
可以用这个。我当时没有看到,所以自己进行了更新,也给出来过程,以供参考:
shell
# 在 https://cmake.org/download/ 页面选择指定的安装sh文件,如https://github.com/Kitware/CMake/releases/download/v4.2.0/cmake-4.2.0-linux-x86_64.sh,执行
wget https://github.com/Kitware/CMake/releases/download/v4.2.0/cmake-4.2.0-linux-x86_64.sh

下载后继续执行:
shell
chmod +x cmake-4.2.0-linux-x86_64.sh
# --skip-license表示自动接受许可,--exclude-subdir防止创建版本号子目录, 安装到 /usr/local,
sudo ./cmake-4.2.0-linux-x86_64.sh --skip-license --exclude-subdir --prefix=/usr/local
执行完毕后,再次执行 cmake --version, 出现了以下报错:
可以执行如下指令设置CMAKE_ROOT和PATH路径:
shell
echo 'export CMAKE_ROOT=/usr/local/share/cmake-4.2' >> ~/.bashrc
echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
再次检查版本:

输出正确。安装完毕。
安装其他需要的工具
shell
sudo yum install -y build-essential autoconf libtool pkg-config
克隆grpc和它的子模块
执行如下指令:
shell
git clone --recurse-submodules -b v1.76.0 --depth 1 --shallow-submodules https://github.com/grpc/grpc
由于我本地git版本过低,报错如下:

我查了本地的git版本,是1.8.3.1
css
git --version

而支持 --shallow-submodules 版本要在2.10.0 以上。因此我升级了环境git,升级方法为源码升级,流程如下:
shell
# 安装编译工具和依赖
sudo yum groupinstall "Development Tools"
sudo yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker
# 下载源码, 这里安装2.25.0版本, 尝试安装了2.52版本, 但是glibc版本太低了, 安装失败
wget https://github.com/git/git/archive/refs/tags/v2.25.0.tar.gz
# 解压
tar -xzf v2.25.0.tar.gz
cd git-2.25.0
# 配置编译选项
make configure./configure --prefix=/usr/local
# 编译(使用多核加速,根据CPU核心数调整)
make -j$(nproc) all
sudo make install
安装完毕后,首先确保~/.bashrc中有如下行:
shell
export PATH="/usr/local/bin:$PATH"

如果没有,则添加上,并且执行:
shell
source ~/.bashrc
然后执行 git --version 查看git版本,应该就对了。

git更新好后,重新拉取:
shell
git clone --recurse-submodules -b v1.76.0 --depth 1 --shallow-submodules https://github.com/grpc/grpc
可以拉取成功。
安装grpc
安装路径就是前面设置的 MY_INSTALL_DIR。
根据 grpc.io/docs/langua... ,安装指令为:
ini
cd grpc # git拉取的仓库文件夹
mkdir -p cmake/build
pushd cmake/build
cmake -DgRPC_INSTALL=ON \
-DgRPC_BUILD_TESTS=OFF \
-DCMAKE_CXX_STANDARD=17 \
-DCMAKE_INSTALL_PREFIX=$MY_INSTALL_DIR \
../..
执行时,我的环境报错:

明显是gcc版本太低了,不支持C++17。因此需要升级gcc,我选择源码升级,升级版本为gcc11。流程如下:
bash
sudo yum groupinstall "Development Tools"
sudo yum install gmp-devel mpfr-devel libmpc-devel
wget https://mirrors.cloud.tencent.com/gnu/gcc/gcc-11.2.0/gcc-11.2.0.tar.gz
tar -xzf gcc-11.2.0.tar.gz
cd gcc-11.2.0
# 建议创建独立的构建目录
mkdir build && cd build
# 配置编译选项,指定安装路径到/usr/local/gcc-11.2.0; 或者这里直接设置成/usr/local即可, 省去后面修改系统变量PATH的步骤
../configure --prefix=/usr/local/gcc-11.2.0 --enable-languages=c,c++ --disable-multilib
# 开始编译,使用所有可用的CPU核心以加快速度
make -j$(nproc)
# 安装(需要root权限)
sudo make install
# 编辑当前用户的bash配置文件,将GCC 11的路径添加到环境变量PATH中,让系统优先使用
echo 'export PATH=/usr/local/gcc-11.2.0/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/gcc-11.2.0/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
# 使更改立即生效
source ~/.bashrc
执行完毕执行,可以执行 gcc -v 进行检查。可以发现已经变成了gcc 11.2。

然后重新执行grpc的cmake命令:
shell
# 首先切换到grpc目录下
rm -rf cmake/build # 删除旧的信息
mkdir -p cmake/build
cd cmake/build
# 修改指令, 确保使用最新的gcc
# 正常我理解这个时候是不用指定编译器版本的, 因为我已经设置了环境变量, 应该默认就是gcc11, 但是很遗憾, 我重试之后, 还是会用gcc 4.8.5来编译, 因此这里指定了编译器版本
cmake -DCMAKE_C_COMPILER=/usr/local/gcc-11.2.0/bin/gcc \
-DCMAKE_CXX_COMPILER=/usr/local/gcc-11.2.0/bin/g++ \
-DgRPC_INSTALL=ON \
-DgRPC_BUILD_TESTS=OFF \
-DCMAKE_CXX_STANDARD=17 \
-DCMAKE_INSTALL_PREFIX=$MY_INSTALL_DIR \
../..
# 编译
make -j$(nproc)
执行编译之后,报错:

这个是因为汇编器版本过低,如我本地的汇编器版本是2.27:

执行如下指令升级汇编器:
shell
# 查看网站 https://ftp.gnu.org/gnu/binutils/ 找到最新版本,这里选择2.45
# 如果发现下载速度过慢, 可以选择国内镜像源, 比如阿里云镜像源:https://mirrors.aliyun.com/gnu/binutils/binutils-2.45.tar.gz
wget http://ftp.gnu.org/gnu/binutils/binutils-2.45.tar.gz
tar -xzf binutils-2.45.tar.gz
cd binutils-2.45
./configure --prefix=/usr/local --enable-gold --enable-plugins --disable-werror
make -j$(nproc) # 使用所有可用的CPU核心进行编译,加快速度
sudo make install
安装完之后再检查一下版本:

升级成功。
重新执行编译指令:
shell
make -j$(nproc)

编译成功
然后执行:
shell
make install
安装。成功之后,在安装目录下可以看到如下文件夹:

C++ grpc helloworld示例程序编译运行
shell
# 首先切换到grpc仓库下
cd examples/cpp/helloworld
mkdir -p cmake/build
pushd cmake/build
cmake -DCMAKE_C_COMPILER=/usr/local/gcc-11.2.0/bin/gcc \
-DCMAKE_CXX_COMPILER=/usr/local/gcc-11.2.0/bin/g++ \
-DCMAKE_PREFIX_PATH=$MY_INSTALL_DIR ../..
make -j$(nproc)
我本地报错:

这是因为GLIBCXX 版本过低,但是实际上我们安装了gcc 11.2 是有高版本的。执行
shell
sudo find / -name "libstdc++.so.6*" 2>/dev/null
指令进行查找:

可以找到更高版本。
执行如下指令正确链接:
shell
sudo cp /usr/local/gcc-11.2.0/lib64/libstdc++.so.6.0.29 /usr/lib64/
cd /usr/lib64
# 备份旧版本(可选但推荐)
sudo cp libstdc++.so.6 libstdc++.so.6.bak
# 创建指向新版本的软链接
sudo ln -sf libstdc++.so.6.0.29 libstdc++.so.6
# 更新动态库缓存
sudo ldconfig
重新回到示例文件夹执行:
bash
make -j$(nproc)
我的机器只有2核2G,会因为内存不足而报如下错误:
shell
[xxxxxxxx@VM-0-5-centos ~/grpc/examples/cpp/helloworld/cmake/build] ((no branch))$ make -j$(nproc)
[ 22%] Built target hw_grpc_proto
[ 27%] Linking CXX executable greeter_server
[ 33%] Linking CXX executable greeter_client
collect2: fatal error: ld terminated with signal 9 [Killed]
compilation terminated.
make[2]: *** [greeter_server] Error 1
make[2]: *** Deleting file `greeter_server'
make[1]: *** [CMakeFiles/greeter_server.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
暂时没有资金去升级机器, 所以先增加一下swap空间来缓解这个问题。流程如下:
bash
# 创建 Swap 文件
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 # 因为系统盘只有40G,所以也不太敢把swap设置太高,搞个2G先看看
# 设置权限
sudo chmod 600 /swapfile
# 格式化并启用
sudo mkswap /swapfile # 格式化
sudo swapon /swapfile # 立即启用
# 设置永久生效
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
执行 free -h , 可以看到已经有swap空间了:

编译完成后。在构建目录 examples/cpp/helloworld/cmake/build 下执行:
-
运行服务器:
shell./greeter_server
-
在另外一个终端运行客户端:
shell./greeter_client
可以看到有结果输出,客户端和服务器可以正常进行通信了。
C++ grpc helloworld示例程序修改运行
以下相关代码都可以在 grpc.io/docs/langua... 中找到。
更新proto定义
在grpc仓库目录下,编辑 examples/protos/helloworld.proto ,增加 SayHelloAgain() 协议。

更新服务器代码
在grpc仓库目录下,编辑examples/cpp/helloworld/greeter_server.cc:

更新客户端代码
在grpc仓库目录下,编辑examples/cpp/helloworld/greeter_client.cc:


重新编译
在grpc仓库目录下的examples/cpp/helloworld/cmake/build中执行:
bash
make -j$(nproc)
build成功之后,再次运行。依然在 examples/cpp/helloworld/cmake/build 目录下:
-
运行服务器
bash./greeter_server
-
再在另外一个终端运行客户端
bash./greeter_client
可以发现新协议通信成功
个人C++项目中依赖grpc示例编译运行
这里给出我简单实现的代码。地址:github.com/EarthlyImmo...
本地运行流程如下:
-
克隆仓库到本地
bashgit clone https://github.com/EarthlyImmortal/blog_code
编辑
-
切换到仓库目录
bashcd blog_code ls -
新建目录grpc,将编译好的grpc相关内容(即MY_INSTALL_DIR)中的内容复制到grpc目录下。如果没有编译可以关注公众号 只做人间不老仙,后台发送 grpc编译文件 获取我编译内容的压缩包。没有直接放到git仓库是因为有些库太大了。下面我以压缩包为例:
-
使用压缩包不用提前新建目录,直接将压缩包上传到当前目录
-
解压
bashtar -xzf grpc_bin.tar.gz ls
-
-
切换到hello_world目录
-
bash
cd hello_world ls -
修改start_build.sh中的gcc和g++路径。切换为自己本地的高版本gcc路径。
-
如果不知道本地高版本gcc路径在哪里,可以执行whereis gcc 进行查找
whereis gcc -
-
如果默认gcc就是高版本,可以将CMake指令中指定版本的部分删除
-
-
运行start_build.sh进行编译
sh start_build.sh
编译完成后,进行运行。
-
在blog_code/hello_world/build/server目录下执行:
bash./server -
另开一个终端,在blog_code/hello_world/build/client目录下执行
bash./client
可以发现,可以正常通信。
注意,为了尽可能不出问题,部署服务器环境要与编译服务器环境一致。这里再次给出我个人编译环境下的主要软件版本:
- CMake版本:4.2.0,安装过程可在 C++ grpc安装 一节找到
- Git版本:2.25.0,安装过程可在 C++ grpc安装 一节找到
- GCC版本:gcc 11.2,安装过程可在 C++ grpc安装 一节找到
- GLIBCXX 版本:libstdc++.so.6.0.29(伴随gcc11.2安装),设置过程可在 C++ grpc helloworld示例程序运行 一节找到
- as & ld版本: 2.45,安装过程可在 C++ grpc安装 一节找到
如遇到其他本文未提及的错误,建议网上查找相关资料或者询问AI工具进行解决。
说明:限于时间和资源原因,上述内容还是在原来的机器上测试的。后面我在另外一台机器上进行复现,在确保以上软件版本正确的情况下,可以编译通过并正常运行。
参考
-
腾讯元宝-deepseek(yuanbao.tencent.com/)辅助。%25E8%25BE%2585%25E5%258A%25A9%25E3%2580%2582 "https://yuanbao.tencent.com/)%E8%BE%85%E5%8A%A9%E3%80%82")
微信公众号:只做人间不老仙
欢迎关注。













