【发布时间】:2021-11-09 17:36:02
【问题描述】:
我很难理解includes 如何在 Bazel 目标中工作的逻辑。我希望我的代码是模块化的,所以我尽量避免使用相对路径或长绝对路径的 #include 语句。
假设我有以下工作区结构:
tree .
.
├── BUILD
├── is_binary_tree
│ ├── BUILD
│ └── is_binary_tree.cpp
├── lib
│ ├── BUILD
│ ├── graphs.cpp
│ └── graphs.h
└── WORKSPACE
我在尝试bazel build //is_binary_tree:is_binary_tree 时收到以下警告,但我不明白这是什么意思:
警告:/is_binary_tree/BUILD:1:10: in 包含 cc_binary 规则的属性 //is_binary_tree:is_binary_tree: '../lib' 解析为 'lib' 不在下面 其包'is_binary_tree'的相对路径。这将是一个 未来的错误
为什么../lib解析为lib。 lib应该在is_binary_tree的父目录下,所以从is_binary_tree的角度来看,可以在../lib找到,是不是这样?
为了摆脱相对路径并避免在is_binary_tree/is_binary_tree.cpp 中出现类似#include ../lib/graphs.h 的内容,我向我的is_binary_tree 目标添加了一个includes 属性,如下所示:
is_binary_tree/is_binary_tree.cpp
#include "graphs.h"
int main(){
return 0;
}
is_binary_tree/BUILD
cc_binary(
name="is_binary_tree",
srcs=["is_binary_tree.cpp"],
includes=["../lib"],
deps=["//lib:graphs"],
)
我收到了上述警告。我错过了什么?
更广泛地说,在#include 语句中没有长相对路径的情况下包含依赖项的最佳方法是什么? (我希望我的代码是模块化的,而不是特定于给定的 Bazel 工作区文件夹组织)
谢谢
【问题讨论】:
-
如果 Bazel 类似于 make 和其他工具,则不要将路径放在 include 语句中,只需放在文件名中。该工具有一个搜索包含文件的路径列表。
-
这正是我想要做的,但我对收到的警告感到困惑。
-
既然你已经把 lib:graphs 做成了一个 dep,你只需要 graph.h 在 hdrs 中。 docs.bazel.build/versions/main/be/c-cpp.html#cc_import.hdrs