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

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

有帮助吗?

解决方案

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

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

回答你原来的问题:

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

将导致链接器使用libfoo的归档版本。 [正确地使用尾部 -Wl,-Bdynamic 非常重要,这样就不会强制使用静态libc。]

其他提示

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

尝试在链接器命令行(即.a或.so库)上删除链接到的库文件的路径,然后删除-static。这应该可以解决问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top