Bazel构建仅头文件库:尖括号引用头文件失败的问题解决
二分查找头文件库Bazel构建错误分析与解决
问题场景
开发仅头文件的二分查找库,使用Bazel构建,目录结构:
my_project/ ├── WORKSPACE ├── lib/ │ ├── BUILD │ └── binary_search.h └── app/ ├── BUILD └── main.cc
lib/BUILD内容:
# lib/BUILD cc_library( name = "binary_search", hdrs = ["binary_search.h"], includes = [".."], visibility = ["//visibility:public"], )
app/BUILD内容:
# app/BUILD cc_binary( name = "app", srcs = ["main.cc"], deps = ["//lib:binary_search"], copts = ["-Ilib/"], )
main.cc中头文件引用:
#include <lib/binary_search.h>
编译报错:
app/main.cc:1:10: fatal error: lib/binary_search.h: No such file or directory 1 | #include <lib/binary_search.h>
问题根源
- 无效的
copts路径:copts = ["-Ilib/"]是相对app目录的路径,但Bazel采用沙盒构建模式,构建时app目标的文件会被隔离到独立目录,该路径在沙盒中不存在,无法正确添加头文件搜索路径。 includes属性未正确传递:lib/BUILD中的includes = [".."]仅作用于当前库自身的编译(此库为仅头文件库,无编译需求),不会将该搜索路径传递给依赖它的app目标,导致编译器无法找到lib/binary_search.h的完整路径。
解决方法(保留尖括号引用)
方案一:通过库的export_includes传递搜索路径(推荐)
修改lib/BUILD,将includes替换为export_includes,把项目根目录导出给依赖目标:
# lib/BUILD cc_library( name = "binary_search", hdrs = ["binary_search.h"], export_includes = [".."], # 将项目根目录导出给依赖此库的目标 visibility = ["//visibility:public"], )
同时删除app/BUILD中的无效copts配置:
# app/BUILD cc_binary( name = "app", srcs = ["main.cc"], deps = ["//lib:binary_search"], )
原理:export_includes会将指定路径添加到所有依赖此库的目标的头文件搜索路径中,编译器就能从项目根目录找到lib/binary_search.h,匹配尖括号的引用方式。
方案二:直接给app目标添加正确的根目录搜索路径(不推荐)
如果不想修改库的配置,可调整app/BUILD的copts为项目根目录的相对路径:
# app/BUILD cc_binary( name = "app", srcs = ["main.cc"], deps = ["//lib:binary_search"], copts = ["-I../"], )
此方法依赖项目目录结构,不符合Bazel的依赖管理规范,仅作为临时 workaround 使用。
内容的提问来源于stack exchange,提问作者Proy
相关产品推荐
相关产品推荐

