如何通过Bazel根据编译标志条件编译C++库及依赖目标?
Bazel实现C++库的条件编译解决方案
你的问题核心是构建标志的定义与select条件不匹配,且命令行选项的使用格式错误。以下是修正后的完整配置:
修正后的BUILD文件
load("@bazel_skylib//rules:common_settings.bzl", "bool_flag", "config_setting") # 定义布尔类型的构建开关,用于控制是否启用特性 bool_flag( name = "use_the_feature", build_setting_default = False, ) # 配置匹配规则:当use_the_feature设为True时触发 config_setting( name = "use_the_feature_enabled", flag_values = { ":use_the_feature": "True", }, ) cc_library( name = "my_library", testonly = True, srcs = [ "somefile.cpp", ], hdrs = [ "libraryheader.hpp", ], copts = select({ ":use_the_feature_enabled": ["-DMY_MACRO"], "//conditions:default": [], }), visibility = ["//path/to/smth:__subpackages__"], deps = [ "//path/to/smth:targ1", # ... 其他依赖 ], )
正确的编译命令
启用MY_MACRO编译:
bazel build --//path/to:use_the_feature=True //path/to:my_library
默认不启用编译:
bazel build //path/to:my_library
关键说明
- 用
bool_flag替代string_flag更适合开关类场景,避免字符串空值的模糊判断 config_setting是连接构建标志与select条件的桥梁,必须明确关联flag的取值- 命令行使用构建标志时,必须带上完整的标签路径(
--//path/to:use_the_feature=True),不能只写--use_the_feature
验证方法
编译时如果启用了标志,你会看到头文件里的#pragma message输出:MY_MACRO is defined,说明条件编译生效。
内容的提问来源于stack exchange,提问作者Gerardo Zinno
相关产品推荐
相关产品推荐

