我们有一个代码库分解成静态库。不幸的是,这些库有循环依赖;例如,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个库具有复杂的相互依存关系。)
我一直在经历欧r Makefiles将第二种形式更改为第一种形式,但现在我的同事们问我为什么......除了“因为它更干净”以及其他形式存在风险的含义以外,我没有很好的答案。
那么,可以多次链接同一个库有没有创建一个问题?例如,如果相同的.o被拉两次,链接是否会失败并带有多重定义的符号?或者是否有任何风险,我们可以用相同静态对象的两个副本结束,从而创建微妙的错误?
基本上,我想知道是否有任何链接时间或运行时失败的可能性多次链接相同的库;如果是的话,如何触发它们。谢谢。
我能想到的唯一问题是当您设法链接两个不同版本的同一个库。这很难做到,并且(IMO)在Linux上不太可能发生。另外,只有20家图书馆看起来不像。值得步入makefile吗?你可以花时间做别的事情。 – SigTerm 2012-02-21 15:43:08
如果您修复库不具有循环依赖关系,则此问题就会消失。 – 2012-02-21 15:46:07
我认为通过检查和分解库去除循环依赖是不可行的?因为这是最简洁的方式 – 2012-02-21 15:46:15