我们有一个被分解成静态库的代码库。不幸的是,这些库存在循环依赖关系;例如,
我知道处理这种情况的“正确”方法是使用链接器的
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被载入两次,链接是否会失败并导致多次定义符号?或者我们是否有风险得到两个相同的静态对象的副本,从而创建微妙的错误?
基本上,我想知道多次链接同一个库是否可能导致链接时或运行时故障;如果是,如何触发它们。谢谢。