【问题标题】:Use both static and dynamically linked libraries in gcc在 gcc 中同时使用静态和动态链接库
【发布时间】:2010-10-23 00:39:17
【问题描述】:

我需要分发一个可以在尽可能多的 x86 Linux 发行版上运行的二进制文件。这意味着我必须静态链接一些库,比如 glibc,因为用户可能没有我使用的版本。其他库必须动态链接,例如 fontconfig,因为它依赖于缓存文件格式和硬编码位置,每个系统可能不同。

执行此操作的命令行选项有哪些?如果我指定 -static,那么 gcc 将拒绝动态链接任何库。

【问题讨论】:

    标签: gcc linker


    【解决方案1】:

    在现代 UNIX 或 Linux 系统上静态链接到任何系统库,尤其是针对 libc,使得二进制文件的可移植性显着更少。只是不要这样做。

    相反,使用向后兼容性(链接在旧系统上的二进制文件继续在所有新系统上运行)对您有利,或者通过将二进制文件链接到旧系统上(我使用 RedHat 6.2,我还没有看到 Linux 系统我的二进制文件在过去 8 年内不会运行),或者使用 autopackage 之类的东西(在写完这个答案后已被删除)。

    回答你原来的问题:

    gcc main.o -Wl,-Bstatic -lfoo -Wl,-Bdynamic
    

    将导致链接器使用 libfoo 的归档版本。 [重要的是要有尾随 -Wl,-Bdynamic,这样你就不会强制使用静态 libc。]

    【讨论】:

    • 我第一次看到对尾随动态的解释,干杯
    • 您的建议经受住了时间的考验。现在我总是在我想支持的最古老的 Linux 上构建。
    • “静态链接到任何系统库,尤其是现代 UNIX 或 Linux 系统上的 libc,,使得二进制文件的可移植性明显降低。”这是什么意思?你介意解释为什么这是真的吗?从我所见,静态链接意味着用户不必担心对他们系统的依赖,使其更加可移植。这是错的吗?
    【解决方案2】:

    需要注意的是,在 Linux 下,如果没有动态库依赖于库,则只能(安全地)静态链接库。这意味着如果您使用任何动态库,您可以忘记静态链接 libc。只需使用相当旧的版本来针对 libc 的情况进行构建;多年来,libc 一直保持强大的 ABI 向后兼容性。

    【讨论】:

      【解决方案3】:

      尝试在链接器命令行(无论是 .a 还是 .so 库)上传递指向要链接的库文件的路径并删除 -static。这应该可以解决问题。

      【讨论】:

      • 当没有-static时还有ld的-l:选项,可以用全名链接某个库,不用ld扩展成lib + name + .so:-l:libsome_library.a( sourceware.org/binutils/docs-2.18/ld/Options.html - -lnamespec "如果 namespec 的格式为 :filename,ld 将在库路径中搜索名为 filename 的文件,否则它将在库路径中搜索名为 libnamespec.a 的文件。")
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多