在CentOS 6 上编译 gRPC-1.65.1
前提条件
确保你的系统已经安装了以下软件包:
- Git
- CMake
- GCC 和 G++
- 必要的开发工具和库
你可以使用以下命令来安装这些依赖项:
sudo yum install -y epel-release
sudo yum install -y cmake gcc-c++ git autoconf automake libtool make
Install openssl (to use instead of boringssl)
download openssl-1.0.2k (同centos7.9的openssl版本):
wget https://codeload.github.com/openssl/openssl/tar.gz/refs/tags/OpenSSL_1_0_2k
编译openssl-1.0.2k:
tar zxvf openssl-OpenSSL_1_0_2k.tar.gz
cd openssl-OpenSSL_1_0_2k
./config --prefix=/path/to/openssl-1.0.2k --shared
make && make install
步骤 1:克隆 gRPC 仓库
首先,克隆 gRPC 仓库并切换到特定版本(例如 v1.65.1
):
# 克隆 gRPC 仓库
git clone https://github.com/grpc/grpc.git
cd grpc
# 切换到特定的 tag
git checkout v1.65.1
# 初始化并更新所有子模块
git submodule update --init --recursive
步骤 2:配置和编译 gRPC
创建一个构建目录并使用 CMake 配置编译环境:
# 创建构建目录
mkdir -p cmake/build
cd cmake/build
# 运行 CMake 配置
cmake ../.. -DgRPC_INSTALL=ON -DCMAKE_BUILD_TYPE=Release -DgRPC_BUILD_TESTS=OFF -DBUILD_SHARED_LIBS=ON -DgRPC_SSL_PROVIDER=package -DCMAKE_INSTALL_PREFIX=/path/to/grpc -DABSL_PROPAGATE_CXX_STD=ON -DOPENSSL_ROOT_DIR=/path/to/openssl-1.0.2k
# 需要编译动态库,添加参数 -DBUILD_SHARED_LIBS=ON
# 需要编译Debug/Release版本,添加参数 -DCMAKE_BUILD_TYPE=Debug/Release
# -DgRPC_SSL_PROVIDER=package 选项是为了使用系统安装ssl lib,在centos6上需要编译更高版本的openssl,建议是1.2.0k同centos7.9的openssl版本一致
# -DOPENSSL_ROOT_DIR=/path/to/openssl-1.0.2k ,上面编译安装的openssl-1.0.2k的位置
编译并安装 gRPC:
# 编译 gRPC
make -j16
# 安装 gRPC
make install
验证安装
你可以通过以下步骤验证 gRPC 是否安装成功:
# 检查库文件
ls /path/to/grpc/lib64
常见问题
问题 1:gRPC_ABSL_PROVIDER is module but ABSL_ROOT_DIR is wrong
Dependency management
gRPC's CMake build system has two options for handling dependencies. CMake can build the dependencies for you, or it can search for libraries that are already installed on your system and use them to build gRPC.
This behavior is controlled by the gRPC_<depname>_PROVIDER CMake variables, e.g. gRPC_CARES_PROVIDER. The options that these variables take are as follows:
module - build dependencies alongside gRPC. The source code is obtained from gRPC's git submodules.
package - use external copies of dependencies that are already available on your system. These could come from your system package manager, or perhaps you pre-installed them using CMake with the CMAKE_INSTALL_PREFIX option.
For example, if you set gRPC_CARES_PROVIDER=module, then CMake will build c-ares before building gRPC. On the other hand, if you set gRPC_CARES_PROVIDER=package, then CMake will search for a copy of c-ares that's already installed on your system and use it to build gRPC.
基于以上官网对于第三方依赖的解释,这里需要下载源码并使用module模式。
如果在编译过程中遇到这个错误,请确保你已经正确初始化和更新了所有子模块。
git submodule update --init --recursive
问题 2:如何确认是否切换到了 v1.65.1
这个 tag?
使用以下命令查看当前的 tag:
# 查看当前状态
git status
# 查看当前 commit 的详细信息
git show
# 使用 git describe 查看当前 tag
git describe --tags
你应该看到类似 HEAD detached at v1.65.1
的输出。
问题 3: invalid conversion from const uint8_t to unsigned char in include/grpc/impl/slice_type.h
依赖高版本openssl导致的问题,升级完没有出现
完整的脚本
以下是一个包含所有步骤的完整脚本,可以复制并运行:
#!/bin/bash
# 安装依赖
sudo yum install -y epel-release
sudo yum install -y cmake gcc-c++ git autoconf automake libtool make
# download openssl-1.0.2k (同centos7.9的openssl版本):
wget https://codeload.github.com/openssl/openssl/tar.gz/refs/tags/OpenSSL_1_0_2k
#编译openssl-1.0.2k:
tar zxvf openssl-OpenSSL_1_0_2k.tar.gz
cd openssl-OpenSSL_1_0_2k
./config --prefix=/path/to/openssl-1.0.2k --shared
make && make install
# 克隆 gRPC 仓库
git clone https://github.com/grpc/grpc.git
cd grpc
# 切换到特定的 tag
git checkout v1.65.1
# 初始化并更新所有子模块
git submodule update --init --recursive
# 创建构建目录
mkdir -p cmake/build
cd cmake/build
# 运行 CMake 配置
cmake ../.. -DgRPC_INSTALL=ON -DCMAKE_BUILD_TYPE=Release -DgRPC_BUILD_TESTS=OFF -DBUILD_SHARED_LIBS=ON -DgRPC_SSL_PROVIDER=package -DCMAKE_INSTALL_PREFIX=/path/to/grpc -DABSL_PROPAGATE_CXX_STD=ON -DOPENSSL_ROOT_DIR=/path/to/openssl-1.0.2k
# 编译 gRPC
make -j16
# 安装 gRPC
make install
# 验证安装
ls /path/to/grpc/lib64
总结
通过以上步骤,你可以在 CentOS 6 上成功编译并安装 gRPC。确保所有依赖项已经正确安装,并按照步骤进行操作。如果遇到问题,可以参考文档中的常见问题部分进行排查。