Bazel C++直接依赖头文件包含检查问题咨询
问题解答
关于你遇到的Bazel行为解释
疑问a:srcs中的头文件为何能被外部访问
你看到的文档描述是最佳实践规范,而非Bazel的强制限制。Bazel默认会把每个目标所在的目录加入编译的include路径中,由于你的所有文件都在同一目录下,hello-world.cc直接#include "dep.h"时,编译器能在当前目录找到该文件,不管它属于哪个库的srcs。
如果要严格实现“srcs里的头仅库自身可见”,可以把不同库的文件放到不同子目录,配合strip_include_prefix或includes属性,让私有头文件的路径只对库自身可见。
疑问b:为何未声明直接依赖仍能编译
Bazel的依赖是传递性的:hello依赖dep,当hello-world依赖hello时,会自动继承hello的所有依赖(包括dep的include路径和编译规则),所以编译器能找到dep.h。但这种写法不符合规范——hello-world直接依赖dep.h却未显式声明,后续如果hello不再依赖dep,hello-world会突然编译失败。
你需要的检查命令
- 检查所有实际直接依赖是否已声明
使用Bazel的头检查Aspect扫描未声明的直接依赖:
bazel build --aspects=@bazel_tools//tools/cpp:header_checker.bzl%check_headers //:hello-world
如果存在未在BUILD中声明的直接依赖,该命令会输出对应的错误提示。
- 检查未使用或仅间接依赖的声明项
用bazel query的unused_deps函数找出目标中未被实际使用的依赖:
bazel query 'unused_deps(//:hello-world)'
若要确认某个依赖是否仅为间接依赖,可以用:
bazel cquery 'somepath(//:hello-world, //:dep)' --output=text
如果输出为空,说明该依赖是间接的;若有路径输出,说明是直接或通过其他路径依赖的。
内容的提问来源于stack exchange,提问作者cnarl
相关产品推荐
相关产品推荐

