我应该 link 一个 C++ 应用程序到间接使用的共享库吗

Should I link a C++ application to shared libraries which are used indirectly

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

我的直觉告诉我,我应该只 link 到 libBeta.so,因为 link 访问所有库似乎是多余的,因为 libBeta.so 已经是 link编到其他图书馆。然而,undefined reference to 错误证明我的直觉是错误的。

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

p.s.:

编辑

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

共享库是完全 linked 实体,您不需要明确 link 它们的依赖关系。

这与静态库不同,静态库只是目标文件的集合。当您使用静态库时,您 必须 link 它的依赖项。但是对于共享库,不,你不需要那个。

如果你得到未定义的引用,那么它不是你 link 到的共享库的依赖项。要么你缺少 linking 自己的代码,要么你实际上 link 使用 static 库。

你只需要link你的直接依赖,libBeta.so

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

This is no longer the case.