【问题标题】:C++: How to create two interdependent shared libraries?C++:如何创建两个相互依赖的共享库?
【发布时间】:2015-11-22 12:21:26
【问题描述】:

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

【问题讨论】:

  • 只是出于好奇,您为什么要这样做?如果每个库都依赖于另一个库,那么除非它们都存在,否则它们都是无用的。与简单地制作一个库相比,您有什么优势?
  • 我正在做一些研究项目。我将我的代码放在不同的文件夹中,每个文件夹都会被编译到一个共享库中,并且共享库之间可能存在一些可能复杂的依赖关系。我不想花太多时间弄清楚这些依赖关系。我想要的是无论不同的共享库如何相互依赖,我总是可以为每个文件夹创建一个共享库。原因是每次修改文件夹时,只会更新其对应的共享库。
  • 您已经可以完成其中的哪些部分?你知道a.cppb.cpp怎么写吗?如何编译成a.ob.o?如何用目标文件构建共享库?
  • 如果没有依赖或者只有一个依赖另一个,我知道如何创建共享库。如果他们相互依赖,我不知道该怎么做

标签: c++ dynamic shared


【解决方案1】:

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

尽管您没有明确提及您使用的平台——共享库实现的细节是高度特定于平台的,因此,无论如何,这类问题的答案取决于平台——给出的名称您在问题中提到的共享库“liba.so”和“libb.so”,您最有可能使用 Linux。

当前大多数 Linux 发行版都配置了它们的运行时加载程序,以便应用程序只能从应用程序显式链接的共享库中解析外部引用。如果您的应用程序与 liba.so 链接,而 liba.so 与 libb.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% 完美的,这种方法可能会偶尔遇到并发、并行构建构建的问题,但这是一般的想法。我仍然建议,鉴于 Linux 运行时加载程序的当前配置,您的应用程序必须与这两个库显式链接,这使得整个事情完全没有必要。

【讨论】:

    猜你喜欢
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    相关资源
    最近更新 更多