gpt4 book ai didi

c++ - 通过两次链接同一个库来解决循环依赖?

转载 作者:IT老高 更新时间:2023-10-28 12:40:19 64 4
gpt4 key购买 nike

我们有一个分解成静态库的代码库。不幸的是,这些库具有循环依赖关系。例如,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)部分提取到其他库中。

关于c++ - 通过两次链接同一个库来解决循环依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9380363/

64 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com