【发布时间】:2018-01-03 08:05:22
【问题描述】:
Bazel 是否有类似于 gcc -( archives -) 或 --start-group archives --end-group link 的功能来处理库之间的循环依赖关系?
另外,Bazel 是否有一个特性,我们可以在 Bazel 中使用这个 gcc 特性?例如,使用 CCFLAGS 之类的东西?
【问题讨论】:
标签: c++ circular-dependency bazel
Bazel 是否有类似于 gcc -( archives -) 或 --start-group archives --end-group link 的功能来处理库之间的循环依赖关系?
另外,Bazel 是否有一个特性,我们可以在 Bazel 中使用这个 gcc 特性?例如,使用 CCFLAGS 之类的东西?
【问题讨论】:
标签: c++ circular-dependency bazel
许多人认为,最好首先避免循环依赖。
假设你有两个文件,a.cc #includes b.h 和 b.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.h 和b.h 复制到一些“公共标头”文件夹(它本身不依赖于其他任何东西)。这样就去掉了文件级别的循环依赖,但是在语义上,源代码在a和b之间还是有循环依赖的。
【讨论】:
如果您不拥有这些库,则必须等到cc_import-kind-of-rule 实施。另见issue #818。目前我不知道有什么解决方法。
【讨论】: