【问题标题】:When linking a binary or shared library, why do I have to pass in shared libraries I depend on?链接二进制或共享库时,为什么必须传入我依赖的共享库?
【发布时间】:2020-02-25 07:17:51
【问题描述】:

假设我正在尝试创建二进制文件myprogrammyprogram 包含一个文件foo.h,其中声明了一些函数;这些函数在libfoo.so 中定义。因此,在构建myprogram 时,我将libfoo.so 传递给链接器...不,不是名称“libfoo.so”而是实际的共享库文件。

我的问题是,为什么这是必要的?我的理解是只有在运行时才需要共享库,此时动态链接器会将其加载到内存中并在myprogram 中修复对它的所有引用。除了将其名称放入共享库列表之外,静态链接器对 libfoo.so 做了什么?

【问题讨论】:

    标签: c++ c linker


    【解决方案1】:

    您混淆了静态和动态链接库。动态库依赖于加载到内存中的运行时模块,并通过导出的方法访问它需要的内容。静态库实际上是直接嵌入到您自己的二进制文件中,而不是单独加载。

    【讨论】:

    • 我不认为 OP 是静态链接。 “静态链接器”似乎只是指构建的链接阶段。
    • 是的,我说的是生成二进制文件的链接步骤。
    【解决方案2】:

    除了将其名称放入共享库列表之外,静态链接器对 libfoo.so 做了什么?

    为了生成动态链接的可执行文件,基本上就是这样!它还证实,在链接时可用的共享库版本,所有未定义的符号引用都由共享库之一定义。此属性允许您进行有意义的构建时(autoconf 样式)测试,例如确保libfoo.so 是一个足够新的版本,可以在其中包含bar 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-06
      • 1970-01-01
      • 2011-10-01
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-24
      相关资源
      最近更新 更多