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

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

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

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

最佳答案

这取决于您的循环依赖的具体情况。

  1. 两个.cc文件相互依赖对方的.h文件

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

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

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

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

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

    呃……我希望你不是这样。

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

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

关于c++ - 使用 Bazel 构建系统构建具有循环依赖性的 C++ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45285327/

相关文章:

c++ - 如何将 C++ Visual Studio 2008 项目降级到 2005

python - 循环依赖导致 ImportError : cannot import name

iOS:循环依赖调用其他类中的方法

android - 使用 bazel 支持在 android 上构建 tensorflow 时出错

c++ - 是否可以在 Visual Studio 中使用 Bazel 构建代码?

docker - Bazel 使用本地 golang 模块构建 docker 容器

c++ - 如何重载 >> 运算符以获取可变参数列表

c++ - OpenCV 窗口卡住

c# - 打印变量时 c# 上是否需要占位符

C++ 包含和循环依赖