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

3
在寻找一种可以处理多种语言并以增量方式构建代码的构建系统时,我发现Bazel是一个非常好的解决方案。但是,我有一个问题没有解决。
我的C++代码存在循环依赖关系。在解决这个问题之前,我需要一个可以构建这样的代码的构建系统。我的问题是,Bazel能否构建具有循环依赖关系的代码,特别是C++代码?如果可以,请有经验的人分享指南或一些有用的链接吗?

2
你有什么阻止你在第一时间修复循环依赖的问题吗? - byxor
请分享你的代码。 - Neo
循环依赖通常是糟糕设计的结果。 - Roy
大家好,谢谢你们的回应。我们已经确定了依赖关系,并正在努力解决它。但这需要些时间。我们想引入Bazel作为我们的构建系统。所以我们有两个选择,要么等到依赖关系解决,要么找到一种方法让Bazel可以处理循环依赖关系。因此,我想知道Bazel是否能够构建具有循环依赖关系的代码。 - Amit Jain
1个回答

5

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

  1. 两个.cc文件相互依赖其.h文件

    可以将两个.cc和.h文件放入同一个cc_library规则中,或者使用仅包含头文件的规则用于.h文件,并使.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,并添加一个新文件b.h,该文件#include a.h。这将始终保持包含顺序一致,并在大部分情况下保持向后兼容(只要它们不都尝试声明相同的符号并且包含它们的代码依赖于顺序)。

  3. 两个互相#include的.cc文件

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

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

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


嗨Ulf,感谢您的回复!它帮了我们很多。我们的存档之间存在循环依赖关系。因此,假设有2个库,libA.a和libB.a。每个库都有多个对象,每个对象都有多个函数。现在这两个库的函数彼此依赖。到目前为止,我们使用gcc的--start-group和--end-group选项来解决链接问题,如以下链接所述:link。Bazel中是否有类似的功能? - Amit Jain
另外,如果Bazel中没有这样的功能,我们是否可以在Bazel中使用gcc链接功能来解决这个问题? - Amit Jain
很抱歉我没有一个好的答案,但是我们的问题跟踪器中已经有了一个现有的条目。 - Ulf Adams
非常感谢你,Ulf! - Amit Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接