所以说我有两个静态构建的库。 libFoo.a和libBar.a。
libFoo.a使用libBar.a中的函数,而libBar.a也使用libFoo.a中的函数。
现在,让我们创建一个使用libFoo和libBar的程序baz.cpp。通常,您将输入:
g++ baz.cpp -lfoo -lbar
但是,由于这两个静态库相互使用...那么,对于如何使编译时链接程序接受这种情况并将它们全部链接在一起,我没有明显的解决方案。
按C ++标准,这是否甚至是明智且允许的事情?如果是这样,有没有一种非hacky的方式来处理此问题?
还是首选方法是将libBar和libFoo中的所有目标文件一起编译到一个静态库中?
答案 0 :(得分:3)
有两种替代解决方案:
-lfoo -lbar -lfoo
。-Wl,--start-group -lfoo -lbar -Wl,--end-group
重复库名的作用是链接器将库扔到当前未定义的符号上并解析所有可能的内容,因此,再次提及一个库,它将解析以前所有库中的符号。始终可以使用它来中断所有周期。
链接器组的作用是它有效地更改了链接器算法:它首先将组中的所有目标文件和库都放入一个错误篮,然后尝试解决所有问题(无论链接器组内部的顺序如何),然后继续下一组。