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

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

相关文章:

linux - 无法在 Ubuntu 16.04 中启动 Docker 服务

java - 无法创建Java虚拟机

linux - 如何安排 tcpdump 在特定时间段内运行?

linux - 使用 ssh 检查远程主机上是否存在文件

linux - 如何将 bash 别名定义为多个命令的序列?

linux - 查找在日期范围之间创建的文件

linux - 将时间跨度(以秒为单位)转换为 shell 中的格式化时间

linux - 分别对每个文件进行 GZip

linux - 将标准输出作为命令行工具的文件名传递?

linux - 从标准输出中获取输出的最后 4 个字符