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

时间:2015-08-27 23:12:43

标签: c++ dynamic shared

假设我想将a.cpp和b.cpp编译成两个独立的共享库liba.so和libb.so,这两个库是相互依赖的,我该如何去做呢?

1 个答案:

答案 0 :(得分:3)

虽然我可以想到实现类似的几种黑客方法,但它们都有各自的缺点,整个问题没有实际意义。

虽然你没有明确提到你使用的是哪个平台 - 并且共享库实现的细节是高度平台特定的,所以在任何情况下,这类问题的答案都是依赖于平台的 - 给出了您在问题中提到的共享库," liba.so"和" libb.so",您最有可能使用Linux。

大多数当前的Linux发行版都配置了运行时加载程序,以便应用程序只能从应用程序显式链接的共享库中解析外部引用。如果你的应用程序链接到与libb.so链接的liba.so,你的应用程序将无法解析libb.so的外部引用,反之亦然。

因此,由于您的应用程序将明确需要与两个共享库链接,因此整个问题没有实际意义。您也可以单独构建两个共享库,并将应用程序与这两个库明确链接。否则,它就不会起作用。

但是如果你真的坚持要把它搞砸了,那么这不应该更复杂,然后明确地将每个库与另一个库联系起来。这是初始引导的问题,可以通过虚拟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

因此,在一天结束时,每个共享库首先自己链接,然后重新链接到另一个库,其他库的依赖也会重新链接,这要归功于它的依赖性。

这并非100%完美,这种方法可能会遇到并发,并行make构建的偶然问题,但这是一般的想法。我仍然建议,鉴于Linux的运行时加载程序的当前配置,您的应用程序必须与两个库明确链接,使整个事情完全没必要。