【问题标题】:Build C++ code with Circular dependency using Bazel Build System使用 Bazel 构建系统构建具有循环依赖的 C++ 代码
【发布时间】:2017-12-30 07:39:36
【问题描述】:

在寻找可以处理多种语言并以增量方式构建代码的构建系统时,我发现 Bazel 是一个非常好的解决方案。但是,有一个问题我没有解决方案。

我有循环依赖的 C++ 代码。在解决之前,我需要一个可以构建此类代码的构建系统。我的问题是,Bazel 可以构建具有循环依赖关系的代码,尤其是 C++ 代码吗?如果是,有人可以分享指南或一些有用的链接吗?

【问题讨论】:

  • 有什么东西阻止你首先修复循环依赖吗?
  • 请分享您的代码。
  • 循环依赖往往是设计不佳的结果。
  • 大家好,感谢您的回复。我们已经确定了依赖关系并正在努力解决它。但努力需要时间。我们想引入 Bazel 作为我们的构建系统。所以我们有两个选择,要么我们等到依赖解决,要么我们找到一种方法 Bazel 可以处理循环依赖。所以我想知道 Bazel 是否能够构建具有循环依赖关系的代码。

标签: c++ circular-dependency bazel build-system


【解决方案1】:

这取决于你的循环依赖到底是什么样的。

  1. 两个 .cc 文件相互依赖于彼此的 .h 文件

    要么将 .cc 和 .h 文件放入同一个 cc_library 规则中,要么对 .h 文件使用仅标头规则,并使 .cc 文件的 cc_library 依赖于相应的其他 cc_library。

  2. #include 彼此的两个 .h 文件

    这些都需要在同一个 cc_library 中,Bazel 才能处理它。

    或者,如果你有包含守卫,那么你可以这样重构:假设文件是​​ a.h 和 b.h。您将 b.h 重命名为 b-impl.h,从 b-impl.h 中删除 #include for a.h,然后添加一个新文件 b.h,其中 #includes a.h。这将使包含顺序始终保持一致,并在大部分向后兼容的同时删除循环(只要它们不尝试声明相同的符号并且包含它们的代码依赖于顺序)。

  3. #include 彼此的两个 .cc 文件

    Err...我希望这不是你的情况。

  4. 两个具有相互符号引用的 .a 文件

    这通常使用 --start-group a.a b.a --end-group 来处理,但目前 Bazel 中并没有这种机制。见https://github.com/bazelbuild/bazel/issues/818

【讨论】:

  • 您好乌尔夫,感谢您的回复!它有很大帮助。我们在档案之间有循环依赖关系。所以,假设有 2 个库,libA.a 和 libB.a。它们每个都有多个对象,每个对象都有多个功能。现在这两个库的功能相互依赖。到目前为止,我们正在使用 gcc 的 --start-group 和 --end-group 选项来解决链接问题,如以下链接中所述:link。Bazel 中是否有任何类似的功能可用?
  • 另外,如果 Bazel 中没有此类功能,我们是否可以使用 Bazel 中的 gcc 链接功能来解决此问题?
  • 恐怕我没有一个好的答案,但我们的问题跟踪器中有一个现有条目。
  • 非常感谢乌尔夫!
猜你喜欢
  • 2022-08-16
  • 2018-03-18
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多