c++ - 相互依赖的静态库

标签 c++ c linker

<分区>

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

最佳答案

有两种替代解决方案:

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

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

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

关于c++ - 相互依赖的静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54639852/

相关文章:

makefile - crti.o 文件丢失

c++ - C/C++ 使用 tcmalloc

c - 在 C 中将文件写入用户的 HOME 目录

c++ - 整数的数组比较

C 使用字符串和 SEGFAULT

c++ - 如何解决--------undefined reference to `__chkstk_ms' --------on mingw

c++ - 两个 .c 文件具有相同的编译设置 - VC++ 报告没有错误并且不编译其中一个

c++ - 将 mac 框架链接到 qt creator

c++ - 在 C++ Boost 库中,为什么某些头文件上有 ".ipp"扩展名

c++ - C++ 标准中与 [basic.link]/7 相关的 GCC 和 clang 之间的矛盾结果