c++ - 如何处理 Bazel 中的 C++ 库循环依赖?

标签 c++ circular-dependency bazel

Bazel 是否具有类似于 gcc -( archives -) 或 --start-group archives --end-group link 的功能?处理库之间的循环依赖?

或者,Bazel 是否具有我们可以在 Bazel 中使用此 gcc 功能的功能?例如,使用 CCFLAGS 之类的东西?

最佳答案

许多人认为,最好首先避免循环依赖。

假设您有两个文件,其中 a.cc #includes b.hb.cc #includes a.h:

cc_library(
  name="a",
  srcs=["a.cc"],
  hdrs=["a.h"],
  deps=[":b"],  # a.cc #includes b.h
)

cc_library(
  name="b",
  srcs=["b.cc"],
  hdrs=["b.h"],
  deps=[":a"],  # b.cc #includes a.h
)

bazel 会提示循环依赖。

如果您拥有所有有问题的代码,避免这些循环依赖的更直接的方法是重新调整您的源代码和 bazel 包,以首先避免依赖。

这里的一个策略是将常见的东西重构到第三个“核心”库 c 中,它既不依赖于 a 也不依赖于 b :

cc_library(
  name="a",
  srcs=["a.cc"],
  hdrs=["a.h"],
  deps=[":c"],  # a.cc #includes c.h
)

cc_library(
  name="b",
  srcs=["b.cc"],
  hdrs=["b.h"],
  deps=[":c"],  # b.cc #includes c.h
)

cc_library(
  name="c",
  srcs=["c.cc"],
  hdrs=["c.h"],
)

另一种策略是采用某种构建步骤将 a.hb.h 复制到某个“公共(public) header ”文件夹(它本身不依赖于任何其他内容) .这消除了文件级循环依赖,但在语义上,源代码在 ab 之间仍然存在循环依赖。

关于c++ - 如何处理 Bazel 中的 C++ 库循环依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45353395/

相关文章:

C++ 多个库定义相同的类名

c++ - QTcpSocket 状态始终连接,即使拔掉以太网线

python - 为什么这种循环导入在 Python 2 中会失败,但在 Python 3 中却不会?

使用 bazel 运行 java_test 时的 java.io.tmpdir

c++ - 如何从接受器循环中的 ENFILE 中恢复

c++ - 我正在努力理解着色器中的某些东西

C++ 类相互使用

java - 这是什么意思以及如何修复 SonarQube Java 问题 "Cycles between packages should be removed"(鱿鱼 :CycleBetweenPackages)

go - Bazel 构建缺少严格的依赖项

java - bazel - netty_tcnative 错误