首页 > 解决方案 > 相互依赖的静态库

问题描述

所以假设我有两个静态构建的库。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 中的所有目标文件一起编译到一个静态库中?

标签: c++clinker

解决方案


有两种替代解决方案:

  • 重复库名称:-lfoo -lbar -lfoo.
  • 使用链接器组:-Wl,--start-group -lfoo -lbar -Wl,--end-group

重复库名称的效果是链接器将库扔到当前未定义的符号处并解析它可以解析的所有内容,因此通过再次提及一个库,它将解析所有先前库中的符号。这总是可以用来打破所有的循环。

链接器组的效果在于它有效地改变了链接器算法:它首先将组中的所有目标文件和库放入一个错误篮子,然后尝试解决所有问题(无论链接器组内的顺序如何),然后继续下一组。


推荐阅读