假设您编译了一个C ++共享库libBeta.so
,它使用了预先存在的C ++共享库libAlpha1.so
,libAlpha2.so
,libAlpha3.so
等。如果我然后写一个直接使用libBeta.so
(因此间接使用其他库)的C ++应用程序,我应该仅将我的应用程序链接到libBeta.so
,还是应该将我的应用程序链接到所有库?
我的直觉告诉我,我应该只链接到libBeta.so
,因为链接到所有库似乎是多余的,因为libBeta.so
已经链接到其他库。但是,undefined reference to
错误证明我的直觉是错误的。
有人可以解释一下为什么我的直觉在特定情况下可能会出错吗?
P.S:
修改
事实证明,我用于编译的工具在编译可执行文件和编译共享库时有不同的行为。编译共享库时,省略了与子库的链接:(
答案 0 :(得分:5)
共享库是完全链接的实体,您无需显式链接到它们的依赖项。
这与静态库不同,静态库只是目标文件的集合。使用静态库时,必须链接到其依赖项。但是对于共享库,你不需要它。
如果您获得未定义的引用,那么它不是您链接到的共享库的依赖项。要么是缺少与自己代码的链接,要么实际上是链接到静态库。
答案 1 :(得分:3)
您只需要与直接相关性libBeta.so
链接。
实际上,几年前在一些Linux发行版中,您可以在可执行文件中间接依赖 - 在这种情况下,例如,在libAlpha1.so
上 - 并且只要依赖项在运行时加载直接或间接地,依赖性将得到满足。