一尘不染

通过链接相同的库两次来解决循环依赖性?

linux

我们有一个分为静态库的代码库。不幸的是,这些库具有循环依赖关系。例如,libfoo.a取决于,libbar.a反之亦然。

我知道处理此问题的“正确”方法是使用链接器--start-group--end-group选项,如下所示:

g++ -o myApp -Wl,--start-group -lfoo -lbar -Wl,--end-group

但是在我们现有的Makefile文件中,问题通常是这样处理的:

g++ -o myApp -lfoo -lbar -lfoo

(想象一下,它扩展到了约20个具有相互依赖关系的库。)

我一直在研究Makefile,将第二种格式更改为第一种,但是现在我的同事问我为什么…除了“因为它更干净”和模糊的感觉,另一种格式有风险之外,我没有有一个很好的答案。

那么,多次链接同一个库 是否会
造成问题?例如,如果相同的.o被拉入两次,则链接是否会失败并带有多个已定义的符号?还是有风险我们可以使用同一静态对象的两个副本来完成,从而产生细微的错误?

基本上,我想知道多次链接同一库是否存在链接时或运行时失败的可能性;如果是这样,如何触发它们。谢谢。


阅读 436

收藏
2020-06-07

共1个答案

一尘不染

我所能提供的只是缺乏反例。实际上,我以前从未见过第一种形式(即使它显然更好),并且总是看到第二种形式可以解决此问题,因此也没有观察到问题。

即使这样,我仍然建议更改为第一种形式,因为它清楚地显示了库之间的关系,而不是依赖于链接器的特定行为。

话虽如此,我建议至少考虑是否有可能重构代码以将通用代码提取到其他库中。

2020-06-07