如何在仅支持C++11的Ubuntu14.04环境编译无Abseil的gRPC++
解决Ubuntu 14.04下无Abseil依赖、C11兼容的gRPC编译问题
1. 锁定兼容的版本组合
不要随意替换第三方protobuf子模块,gRPC 1.46.7官方适配的protobuf版本为3.19.6,版本不匹配会引发API兼容问题。按以下步骤拉取并重置代码:
git clone --depth 1 --branch v1.46.7 https://github.com/grpc/grpc.git cd grpc git submodule update --init --recursive --depth 1 # 强制将protobuf子模块切换到指定版本 cd third_party/protobuf git checkout v3.19.6 cd ../..
2. 显式禁用Abseil并强制C++11标准
gRPC 1.46.x默认会尝试启用Abseil,必须通过编译开关完全禁用,同时指定C++11标准。使用CMake编译时,执行以下命令:
mkdir -p cmake/build cd cmake/build cmake \ -DCMAKE_CXX_STANDARD=11 \ -DCMAKE_CXX_STANDARD_REQUIRED=ON \ -DGRPC_ABSL_PROVIDER=none \ -DGRPC_PROTOBUF_PROVIDER=module \ -DGRPC_BUILD_TESTS=OFF \ -DGRPC_BUILD_EXAMPLES=OFF \ ../.. make -j$(nproc)
参数说明:
-DGRPC_ABSL_PROVIDER=none:彻底禁用Abseil依赖-DCMAKE_CXX_STANDARD=11:强制编译器使用C++11-DGRPC_PROTOBUF_PROVIDER=module:使用gRPC自带的protobuf子模块编译
3. 适配Ubuntu 14.04的gcc版本
Ubuntu 14.04默认gcc 4.8对部分C++11特性支持不完善,建议升级到gcc 5.x:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update sudo apt-get install gcc-5 g++-5 # 临时设置默认编译器 export CC=gcc-5 export CXX=g++-5
设置完成后再执行上述CMake和编译命令。
4. 额外禁用C++14依赖组件
为避免编译时触发C++14特性,添加以下CMake参数进一步限制:
cmake \ ... -DGRPC_BUILD_CSHARP_EXT=OFF \ -DGRPC_BUILD_GRPC_CSHARP_PLUGIN=OFF \ -DGRPC_BUILD_GRPC_NODE_PLUGIN=OFF \ -DGRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN=OFF \ -DGRPC_BUILD_GRPC_PHP_PLUGIN=OFF \ -DGRPC_BUILD_GRPC_PYTHON_PLUGIN=OFF \ -DGRPC_BUILD_GRPC_RUBY_PLUGIN=OFF \ ../..
5. 验证编译结果
编译完成后,检查生成的库是否未链接Abseil:
ldd libgrpc++.so | grep absl
无输出则说明成功禁用Abseil依赖。
内容的提问来源于stack exchange,提问作者mdcraver




