我们有一个分解成静态库的代码库。不幸的是,这些库具有循环依赖关系。例如,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 个具有复杂相互依赖性的库。)
我一直在检查我们的 Makefiles 将第二种形式更改为第一种形式,但现在我的同事问我为什么......除了“因为它更干净”以及另一种形式有风险的模糊感觉之外,我没有一个好的答案。
那么,多次链接同一个库会产生问题吗?例如,如果相同的 .o 被拉入两次,链接是否会因多重定义的符号而失败?或者是否存在任何风险,我们可能会得到同一个静态对象的两个拷贝,从而产生细微的错误?
基本上,我想知道多次链接同一个库是否会导致链接时或运行时失败;如果是这样,如何触发它们。谢谢。
最佳答案
我能提供的只是缺乏反例。实际上,我以前从未见过第一种形式(尽管它显然更好),并且总是看到用第二种形式解决了这个问题,因此没有观察到问题。
即便如此,我仍然建议更改为第一种形式,因为它清楚地显示了库之间的关系,而不是依赖于以特定方式运行的链接器。
也就是说,我建议至少考虑是否有可能重构代码以将公共(public)部分提取到其他库中。
https://stackoverflow.com/questions/9380363/