我们将代码库分解为静态库.不幸的是,这些库具有循环依赖性; 例如,libfoo.a取决于,libbar.a反之亦然.
我知道处理这个的"正确"方法是使用链接器--start-group和--end-group选项,如下所示:
g++ -o myApp -Wl,--start-group -lfoo -lbar -Wl,--end-group
Run Code Online (Sandbox Code Playgroud)
但在我们现有的Makefile中,问题通常是这样处理的:
g++ -o myApp -lfoo -lbar -lfoo
Run Code Online (Sandbox Code Playgroud)
(想象一下,这扩展到约20个具有复杂相互依赖性的库.)
我一直在通过我们的Makefiles将第二种形式更改为第一种形式,但现在我的同事们问我为什么......除了"因为它更清洁"以及另一种形式存在风险的模糊感,我不这样做有一个很好的答案.
因此,可以连接同一个库多次曾经创造出了问题?例如,如果同一个.o被拉入两次,链接是否会失败?或者是否有任何风险,我们可以结束相同的静态对象的两个副本,创建微妙的错误?
基本上,我想知道链接时间或运行时失败是否有可能多次链接同一个库; 如果是的话,如何触发它们.谢谢.
好奇的是,GCC或Clang工具集目前是否实现了相同的MSVC 相同的COMDAT折叠(ICF)?如果没有,有什么计划吗?除了旧的GCC邮件列表消息之外,我似乎无法找到关于该主题的任何最新权威链接.
如果不是,这是否意味着不同类型的模板实例化在结果二进制文件中始终是不同的函数(在它们没有完全内联的情况下),即使它们是二进制兼容的,或者是否存在其他机制来处理它在其他一些水平?
此外,有没有人发现ICF在最大限度地减少实际可执行文件的大小方面有很大的不同?我没有任何大型MSVC项目可以方便地进行测试.(我猜它只是真的有帮助,如果你碰巧在许多不同的vtable-layout兼容类型上实例化模板.)
最后,是否符合C++ 11标准的两个函数指针指向不同的函数,以便在运行时进行相等比较?这个链接似乎意味着它不是,但它适用于C99.编辑:发现此主题的上一个问题