我应该链接一个C++;应用于间接使用的共享库 < C++ >编译C++ C++共享库 LBBeta。所以使用预先存在的C++共享库 LBalpHA1。所以, LBalpHA2。SO < /C> >,代码> LBalpHA3。SO < /C> >。如果我写了一个C++应用程序,它使用 LBeta。我应该只将我的应用程序链接到libBeta.so,还是应该将我的应用程序链接到所有库

我应该链接一个C++;应用于间接使用的共享库 < C++ >编译C++ C++共享库 LBBeta。所以使用预先存在的C++共享库 LBalpHA1。所以, LBalpHA2。SO < /C> >,代码> LBalpHA3。SO < /C> >。如果我写了一个C++应用程序,它使用 LBeta。我应该只将我的应用程序链接到libBeta.so,还是应该将我的应用程序链接到所有库,c++,compilation,g++,shared-libraries,dynamic-linking,C++,Compilation,G++,Shared Libraries,Dynamic Linking,我的直觉告诉我,我应该只链接到libBeta.so,因为链接到所有库似乎都是多余的,因为libBeta.so已经链接到了其他库。然而,对错误的未定义引用证明了我的直觉是错误的 有人能解释一下为什么我的直觉在某些情况下可能是错误的吗 p、 s: 操作系统:Linux 编译程序:g++ 编辑 事实证明,我用于编译的工具在编译可执行文件和编译共享库时具有不同的行为。编译共享库时忽略了与子库的链接:(共享库是完全链接的实体,您不需要显式链接到它们的依赖项 这与静态库不同,静态库只是对象文件的集合。使

我的直觉告诉我,我应该只链接到
libBeta.so
,因为链接到所有库似乎都是多余的,因为
libBeta.so
已经链接到了其他库。然而,
错误的未定义引用证明了我的直觉是错误的

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

p、 s:

  • 操作系统:Linux
  • 编译程序:g++
编辑


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

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

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


如果您得到了未定义的引用,那么这不是因为您链接到的共享库的依赖关系。这可能是因为您缺少与自己的代码的链接,或者您实际上链接到了一个静态库。

共享库是完全链接的实体,您不需要显式链接到它们的依赖关系

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


如果您得到了未定义的引用,那么这不是因为您链接到的共享库的依赖关系。这可能是因为您缺少与自己的代码的链接,或者您实际上链接到了一个静态库。

您只需要与您的直接依赖关系,
libBeta.so
链接即可

实际上,几年前,在一些Linux发行版上,您可以在可执行文件中使用间接依赖项——在本例中,例如在
libAlpha1.so
——并且只要在运行时直接或间接加载依赖项,依赖项就会得到满足


.

您只需要与您的直接依赖项链接,
libBeta.so

实际上,几年前,在一些Linux发行版上,您可以在可执行文件中使用间接依赖项——在本例中,例如在
libAlpha1.so
——并且只要在运行时直接或间接加载依赖项,依赖项就会得到满足


.

如果你说你得到了未定义的引用链接器错误,那么告诉我们这些错误是什么可能会有帮助,那么我们可以更容易地帮助你。如果你说你得到了未定义的引用链接器错误,那么可能会帮助我们这些错误是什么,那么我们可以更容易地帮助你。你描述的行为正是我所期望的,但不是我所期望的我正在使用一个由大量C++库组成的框架。我创建了一个共享库,它与我需要的框架的部分接口。接下来我写了一个简单的测试应用程序,它只包含主程序()。并从我的库中调用一个函数。如果我仅链接到我的库,我的应用程序无法正确编译,但如果我链接到所有库,它确实可以工作。是的,我检查了所有依赖项是否都是共享库。您描述的行为正是我所期望的,但不是我所得到的。我使用的框架包括我创建了一个C++库的大集合。我创建了一个共享库,它与我需要的框架的部分接口。接下来我编写了一个简单的测试应用程序,它只包含主程序()。并从我的库中调用一个函数。如果我仅链接到我的库,我的应用程序无法正确编译,但如果我链接到所有库,它确实可以工作。是的,我检查了所有依赖项是否都是共享库。我同意,但请参阅注释。这意味着您没有正确链接共享库。您的一个共享库引用了另一个共享库中的符号,但没有与之链接。如果我理解正确,您是说我忘记将
libBeta.so
链接到它的一个依赖项,因此在编译应用程序时,我被迫链接到所有子依赖项(理想情况下应该只依赖于
libBeta.so
)?嗯,你可能忘了链接到它的一个依赖项。如果你能找出哪个依赖项,你只需要将你的应用程序直接链接到该库。但是,当然,正确的答案是首先正确地链接libBeta。我完全同意你的看法,这很令人沮丧,因为我曾经反复检查过ything.我的应用程序当前链接到所有
libBeta.so
也链接到的库。因此,如果我缺少
libBeta.so
的依赖项,我在编译应用程序时也应该缺少相同的依赖项(事实并非如此)。非常混乱:(我同意,但请参阅注释。这意味着您没有正确链接共享库。您的一个共享库引用了另一个共享库中的符号,但未与之链接。如果我理解正确,您是说我忘记将
libBeta.so
链接到它的一个依赖项,因此我不得不这样做。)编译应用程序时链接到所有子依赖项(理想情况下,它应该只依赖于
libBeta.so
)?嗯,您