相互依赖的静态库

Interdependent Static Libraries

本文关键字:静态 依赖      更新时间:2023-10-16
假设

我有两个静态构建的库。 libFoo.a 和 libBar.a.

libFoo.a 使用 libBar.a 中的函数

,libBar.a 也恰好使用 libFoo.a 中的函数。

现在,让我们创建一个使用 libFoo 和 libBar 的程序 baz.cpp。通常,您会键入:

g++ baz.cpp -lfoo -lbar

但是,由于这两个静态库相互使用...好吧,对于如何让编译时链接器接受这种情况并将它们链接在一起,我没有明显的解决方案。

按照C++标准,这甚至是明智和允许的事情吗?如果是这样,有没有一种非黑客方法来解决这个问题?

或者首选方法是将libBar和libFoo中的所有目标文件一起编译到一个静态库中?

有两种替代解决方案:

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

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

链接器组

的效果是它有效地更改了链接器算法:它首先将组中的所有对象文件和库抛到一个 bug 篮中,然后尝试解析所有内容(无论链接器组内的顺序如何(,然后继续下一个组。