如何在Bazel项目或工作空间中设置C++标准版本?
Bazel C++标准版本设置方案
结论
Bazel完全支持全局(工作空间维度)和单个目标维度设置C标准,可适配逐步迁移C版本的需求。
1. 全局工作空间设置(所有目标默认生效)
有两种配置方式:
- 单次构建时指定命令行参数:
bazel build --cxxopt=-std=c++14 //... - 固定到配置文件免每次输入:在工作空间根目录新建
.bazelrc文件,添加如下内容:
后续直接执行build --cxxopt=-std=c++14bazel build //...就会默认传入该标准参数。
2. 单个目标单独设置(适配逐步迁移场景)
如果只需要给特定包/目标设置更高版本的C标准,直接在cc_library/cc_binary/cc_test等C规则的copts属性中指定标准即可,该参数优先级高于全局配置,会自动覆盖全局的-std设置:
cc_library( name = "cpp17_component", srcs = ["component.cpp"], hdrs = ["component.h"], copts = ["-std=c++17"], # 仅该目标使用C++17标准编译 )
注意:存在依赖关系的目标建议保持C++标准一致,避免出现ABI兼容问题。
最小可运行示例
目录结构
<工作空间根目录> ├── WORKSPACE ├── .bazelrc ├── BUILD ├── main.cpp └── cpp17_test.cpp
各文件内容
- WORKSPACE:空文件即可,用于标识Bazel工作空间根目录
- .bazelrc(全局默认配置C++14)
build --cxxopt=-std=c++14 - main.cpp(使用C++14特性测试)
#include <iostream> #include <memory> int main() { auto int_ptr = std::make_unique<int>(20); std::cout << "C++14 test: " << *int_ptr << std::endl; return 0; } - cpp17_test.cpp(使用C++17特性测试)
#include <iostream> #include <variant> int main() { std::variant<int, const char*> test_val = "C++17 test passed"; std::cout << std::get<const char*>(test_val) << std::endl; return 0; } - BUILD文件
# 默认使用全局C++14标准 cc_binary( name = "cpp14_demo", srcs = ["main.cpp"], ) # 单独指定使用C++17标准 cc_binary( name = "cpp17_demo", srcs = ["cpp17_test.cpp"], copts = ["-std=c++17"], )
测试执行
执行以下命令均可正常编译通过:
bazel build //:cpp14_demo bazel build //:cpp17_demo
运行编译产物即可正常输出对应结果。
内容的提问来源于stack exchange,提问作者RAM
相关产品推荐
相关产品推荐

