如何在Bazel的不同模块BUILD文件间共享.h头文件?
跨模块头文件引用的Bazel配置方案(相对路径实现)
假设你的Git仓库目录结构大致如下(每个模块独立带BUILD文件):
repo-root/ ├── module_a/ # 提供头文件的模块 │ ├── include/ │ │ └── module_a.h │ └── BUILD └── module_b/ # 需要引用头文件的模块 ├── src/ │ └── module_b.cc └── BUILD
1. 配置提供头文件的模块(module_a)
不要用export files,而是用cc_library封装头文件,这是Bazel管理头文件依赖的标准方式。在module_a/BUILD中写:
cc_library( name = "module_a", # 指定要暴露的头文件 hdrs = ["include/module_a.h"], # 去掉头文件路径中的"include"前缀,让其他模块可以直接用#include "module_a.h" strip_include_prefix = "include", # 控制可见性:如果只允许module_b引用,就写["//module_b:__pkg__"];全局可用写"//visibility:public" visibility = ["//module_b:__pkg__"], )
2. 配置依赖模块(module_b)
在module_b/BUILD中,通过目标依赖的方式引入module_a,Bazel会自动处理头文件路径:
cc_library( name = "module_b", srcs = ["src/module_b.cc"], # 依赖module_a的cc_library目标,路径是相对于仓库根的相对路径 deps = ["//module_a:module_a"], )
3. 代码中引用头文件
在module_b.cc里直接写:
#include "module_a.h"
为什么export files没用?
export files只是把文件暴露给其他Bazel规则,但不会告诉编译器头文件的搜索路径。Bazel是基于目标依赖的构建系统,必须通过cc_library这类目标来封装头文件,让依赖它的模块自动获得头文件搜索路径,这样编译器才能找到对应的.h文件。
内容的提问来源于stack exchange,提问作者Krash10
相关产品推荐
相关产品推荐

