首页 > 解决方案 > 创建具有循环依赖关系的共享库的最佳方法是什么?

问题描述

有没有创建两个库 liba.so 和 libb.so 的好方法,它们相互依赖?除非两个库都已经存在,否则以下内容将不起作用:

g++ -fPIC -L. -shared -lb a.cpp -o liba.so
g++ -fPIC -L. -shared -la b.cpp -o libb.so

我可以创建没有依赖关系的 liba.so,然后根据 liba.so 创建 libb.so,然后重新链接 liba.so 或使用 patchelf 修复它。有没有更好的办法?

或者所有库都没有依赖关系会更好,只是确保主应用程序链接所有递归需要的东西?

背景:这是一个捆绑的应用程序,用户只会使用主应用程序,而不是库本身。我们目前正在使用静态库,但正在研究共享库,以避免增量构建的链接时间过长,并减少几个应用程序的总大小,这些应用程序都使用一组通用的库函数。

标签: linuxlinkershared-libraries

解决方案


依赖关系不一定是坏的,但它们在循环时有时会很混乱,导致在“愚蠢”的链接器中出现这样的事情,当它们在命令行上遇到时,它们只会从库中提取未定义的符号。

-llib1 -llib2 -llib1 # or, progressively worse:
-llib1 -llib2 -llib3 -llib1 -llib2 -llib1

我通常只是重构库,以便依赖是一种方式。例如,拆分lib1所以依赖链是一种方式(并不总是可能的,但这将是一个非常复杂的链):

lib1a (depends on) lib2 (depends on) lib1b

推荐阅读