使用Bazel构建系统构建具有循环依赖性的C++代码

Build C++ code with Circular dependency using Bazel Build System

本文关键字:构建 依赖性 C++ 循环 代码 Bazel 系统 使用      更新时间:2023-10-16

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

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

这取决于循环依赖项的确切外观。

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

    将.cc和.h文件放在同一个cc_library规则中,或者对.h文件使用仅限标头的规则,并使.cc文件的cc_library's依赖于相应的其他cc_libray。

  2. 两个.h文件,#相互包含

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

    或者,如果你有include保护,那么你可以这样重构:假设文件是a.h和b.h。你可以将b.h重命名为b-impl.h,从b-impl.h中删除a.h的#include,并添加一个新的文件b.h,#includea.h。这将使包含顺序始终一致,并在基本上向后兼容的情况下删除循环(只要它们不都试图声明相同的符号,并且包括它们的代码取决于顺序)。

  3. 两个.cc文件,#相互包含

    错误。。。我希望你不是这样。

  4. 具有相互符号参考的2.a文件

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