使用Bazel构建GRPC时遇-Wdeprecated-enum-enum-conversion未知警告组错误
解决Bazel构建gRPC时clang不识别-Wdeprecated-enum-enum-conversion的问题
问题原因
你使用的clang 6.0.0版本过旧,-Wdeprecated-enum-enum-conversion这个警告选项是从clang 7.0开始支持的,而protobuf的port_def.inc文件中直接启用了该警告,导致老版本clang编译报错。
解决方案
方案1:升级clang到支持该选项的版本(推荐)
Ubuntu 18.04默认clang版本为6.0,可通过LLVM官方源安装更高版本:
- 添加LLVM源:
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - sudo add-apt-repository "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-10 main" - 更新包列表并安装clang 10:
sudo apt update sudo apt install clang-10 lldb-10 lld-10 - 设置默认clang版本:
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-10 100 sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-10 100 - 验证版本:
显示clang 10.x即可,之后重新执行clang --versionbazel build :all。
方案2:临时修改protobuf的port_def.inc文件
找到构建目录下的external/com_google_protobuf/src/google/protobuf/port_def.inc文件,定位到第1009行的#pragma GCC diagnostic warning "-Wdeprecated-enum-enum-conversion",修改为带版本判断的指令:
#if __clang_major__ >= 7 #pragma GCC diagnostic warning "-Wdeprecated-enum-enum-conversion" #endif
保存后重新执行构建。注意:该修改会在Bazel清理缓存或重新拉取依赖时被覆盖,仅适合临时测试。
方案3:通过Bazel参数强制禁用该警告
构建时直接传递编译选项,强制忽略这个警告:
bazel build :all --cxxopt="-Wno-deprecated-enum-enum-conversion"
如果老版本clang不识别-Wno-deprecated-enum-enum-conversion,可在项目根目录创建.bazelrc文件,添加以下内容忽略所有未知警告选项:
build:clang6 --cxxopt="-Wno-unknown-warning-option" build --config=clang6
之后重新执行构建即可。
内容的提问来源于stack exchange,提问作者HRC
相关产品推荐
相关产品推荐

