C++ 应用程序中库之间循环依赖的影响

C++ 应用程序中库之间循环依赖的影响,c++,linux,windows,C++,Linux,Windows,我一直在想这件事。假设我有一个程序(或应用程序),其大部分库链接到应用程序B中的预编译库;那么,让应用程序B的部分链接到应用程序A中的特定库可以吗?这实际上取决于A和B的关系,以及A的库L(A)与A的关系,以及B的库L(B)与B的关系 如果L(B)以任何方式依赖于B,因为A依赖于L(B),那么A依赖于B,我甚至可以说A和B本质上是一个应用。在这种情况下,如果B与L(A)连接,将不会有太大的区别,但从长远来看,最终分离关注点将更加困难 然而,要实现这一点,您必须确保A或L(A)链接到的L(B)子集

我一直在想这件事。假设我有一个程序(或应用程序),其大部分库链接到应用程序B中的预编译库;那么,让应用程序B的部分链接到应用程序A中的特定库可以吗?

这实际上取决于A和B的关系,以及A的库L(A)与A的关系,以及B的库L(B)与B的关系

如果L(B)以任何方式依赖于B,因为A依赖于L(B),那么A依赖于B,我甚至可以说A和B本质上是一个应用。在这种情况下,如果B与L(A)连接,将不会有太大的区别,但从长远来看,最终分离关注点将更加困难

然而,要实现这一点,您必须确保A或L(A)链接到的L(B)子集不依赖于L(A)


如果L(B)独立于B(它可以被认为是一组可重用的库),那么我会说L(B)并不是B的一部分,除了B链接到它之外。因此,在链接时,a和B之间存在明显的关注点分离,不建议将B链接到L(a),当然,除非L(a)独立于a,也可以被视为一组独立的、可重用的库。

不,不是。如果不是不可能的话,它会使构建过程变得更加复杂。构建中的循环dep太糟糕了,不要这样做。我喜欢您尝试采取的更细致的方法,但我不确定您是否正确描述了它。假设B有多个库,L1(B)、L2(B)、L3(B);统称为L*(B)。如果A依赖于库L*(B),那么要构建A,必须完成L*(B)的构建。然而,如果L*(B)中的任何一个依赖于A中的某个东西,那么你在构建B之前就已经构建了A,这让你陷入了鸡和蛋的两难境地。分离组件以避免参考循环是至关重要的。也许L3(B)依赖于L2(A),但大多数A依赖于L1(B)和L2(B)。[继续][继续]在这种情况下,您将构建(B-L3(B)),A,然后是L3(B)。这有点粗鲁;B中可能有一些程序依赖于L3(B),因此它们将在第三阶段构建。但关键的一点是,您必须以某种方式打破循环依赖关系,而分区构建是适当的,可以说是必要的步骤。您是正确的。你可能在我编辑的时候表达了你的评论。我补充了一项声明。。。。还是我不清楚我是如何表达的?无论如何,我更喜欢你的描述。我想我关心的是,你的L(A)和L(B)并没有表明在L(A)和L(B)中会有独立的库;多个库。如果存在单个库L1(A)和L2(B),其中L1(A)依赖于L2(B)中的内容,L2(B)中的内容依赖于L1(A)中的内容,那么生活就是地狱!我曾与两个相互参照的图书馆合作;一次重构删除了一个库中未使用的函数,并中断了一堆代码的(静态)链接,因为删除的函数x-ref会在另一个库中填充内容。链接已重新扫描库;添加第三次扫描…我最终重新插入了一个乱伦的交叉引用以保持链接正常工作,但正确的解决方案是将两个库合并为一个库。不这样做有一些原因(惯性是其中之一;跨平台构建问题是另一个),但这是正确的解决方案。应尽可能避免循环依赖关系!