【问题标题】:How can I avoid relative paths in #includes when building with Bazel使用 Bazel 构建时如何避免#includes 中的相对路径
【发布时间】: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

标签: c++ bazel


【解决方案1】:

includes 应该进入 //lib:graphs,以便任何依赖它的东西(在 deps 中)使用它。 lib/BUILD 应该是这样的:

cc_library(
    name = "graphs",
    hdrs = ["graphs.h"],
    srcs = ["graphs.cpp"],
    includes = ["."],
    visibility = ["//visibility:public"],
)

然后你从is_binary_tree 中删除includes,它应该可以工作。

通常,每个 Bazel 目标都包含有关其文件的信息。它依赖于其他目标来使用他们的文件。

更广泛地说,Bazel 默认使用 #include 相对于 repository 的基础的路径。这意味着您可以在任何文件中写入#include "lib/graphs.h",无论是is_binary_tree/is_binary_tree.cpp 还是x/y/z/foobar.cpp。这避免了graphics/constants.haudio/constants.h 之间的冲突,而无需使用绝对路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-18
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多