我应该将C ++应用程序链接到间接使用的共享库

时间:2016-04-12 12:19:49

标签: c++ compilation g++ shared-libraries dynamic-linking

假设您编译了一个C ++共享库libBeta.so,它使用了预先存在的C ++共享库libAlpha1.solibAlpha2.solibAlpha3.so等。如果我然后写一个直接使用libBeta.so(因此间接使用其他库)的C ++应用程序,我应该仅将我的应用程序链接到libBeta.so,还是应该将我的应用程序链接到所有库?

我的直觉告诉我,我应该只链接到libBeta.so,因为链接到所有库似乎是多余的,因为libBeta.so已经链接到其他库。但是,undefined reference to错误证明我的直觉是错误的。

有人可以解释一下为什么我的直觉在特定情况下可能会出错吗?

P.S:

  • 操作系统:Linux
  • 编译器:g ++

修改

事实证明,我用于编译的工具在编译可执行文件和编译共享库时有不同的行为。编译共享库时,省略了与子库的链接:(

2 个答案:

答案 0 :(得分:5)

共享库是完全链接的实体,您无需显式链接到它们的依赖项。

这与静态库不同,静态库只是目标文件的集合。使用静态库时,必须链接到其依赖项。但是对于共享库,你不需要它。

如果您获得未定义的引用,那么它不是您链接到的共享库的依赖项。要么是缺少与自己代码的链接,要么实际上是链接到静态库。

答案 1 :(得分:3)

您只需要与直接相关性libBeta.so链接。

实际上,几年前在一些Linux发行版中,您可以在可执行文件中间接依赖 - 在这种情况下,例如,在libAlpha1.so上 - 并且只要依赖项在运行时加载直接或间接地,依赖性将得到满足。

This is no longer the case