C++:如何创建两个相互依赖的共享库?

C++: How to create two interdependent shared libraries?

假设我想将a.cpp和b.cpp编译成两个独立的共享库liba.so和libb.so并且这两个库是相互依赖的,我该怎么做是吗?

虽然我可以想到几种 hack-ish 的方式来实现类似的东西,但它们都有自己的缺点,并且由于以下原因,整个问题没有实际意义。

虽然您没有明确提及您使用的是哪个平台——共享库实现的细节是高度特定于平台的,因此,无论如何,这类问题的答案是平台相关的——鉴于您在问题中提到的共享库的名称 "liba.so" 和 "libb.so",您很可能使用 Linux.

大多数当前 Linux 发行版都配置了它们的运行时加载程序,以便应用程序只能解析来自应用程序明确 link 的共享库的外部引用。如果您的应用程序 links 与 liba.so,其中 links 与 libb.so,您的应用程序将无法解析来自 libb.so 的外部引用,反之亦然.

因此,由于您的应用程序明确需要 link 使用两个共享库,因此整个问题都没有实际意义。您不妨单独构建两个共享库,并明确 link 您的应用程序同时使用它们。不然不行。

但是如果你真的坚持要破解它,那么这应该不会比显式 link 将每个库与另一个库更复杂。有一个初始引导问题,可以通过虚拟 Makefile 目标解决。简而言之,Makefile 可能会读成这样:

liba.so: liba.so-target libb.so-target
    [link command with -llibb.so]

libb.so: libb.so-target liba.so-target
    [link command with -lliba.so]

liba.so-target: [all object modules that build liba.so]
    [link command without -llibb.so]
    touch liba.so-target

libb.so-target: [all object modules that build libb.so]
    [link command without -lliba.so]
    touch libb.so-target

所以,在一天结束时,每个共享库首先得到自己的 linked,然后针对另一个库重新linked,还有另一个库的依赖项重新linked,这也归功于它的依赖性。

这不是 100% 完美,这种方法可能偶尔会遇到并发、并行 make 构建的问题,但这是总体思路。我仍然建议,考虑到 Linux 的运行时加载器的当前配置,您的应用程序必须明确地 link 使用这两个库,这使得整个事情完全没有必要。