在gcc中使用静态和动态链接库

Ste*_*nov 45 linker gcc

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

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

Emp*_*ian 80

libc在现代UNIX或Linux系统上静态链接任何系统库,特别是反对,使得二进制文件的可移植性显着降低.只是不要这样做.

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

回答你原来的问题:

gcc main.o -Wl,-Bstatic -lfoo -Wl,-Bdynamic
Run Code Online (Sandbox Code Playgroud)

将导致链接器使用libfoo的归档版本.[ -Wl,-Bdynamic精确地设置尾部非常重要,因此不要强制使用静态libc.]

  • 我第一次看到对这种动态,欢呼的解释 (9认同)
  • 你的建议经受住了时间的考验。现在我总是建立在我想要支持的最古老的 Linux 上。 (3认同)

bdo*_*lan 5

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