【发布时间】:2014-04-10 06:45:08
【问题描述】:
一些 linux 程序,例如 mongodb 二进制文件,可以在不同版本的 linux 上运行,无论主机 gcc 版本和 glibc 版本如何。
如何做到这一点?静态链接所有库?但是我听说glibc不应该是静态链接的。
【问题讨论】:
一些 linux 程序,例如 mongodb 二进制文件,可以在不同版本的 linux 上运行,无论主机 gcc 版本和 glibc 版本如何。
如何做到这一点?静态链接所有库?但是我听说glibc不应该是静态链接的。
【问题讨论】:
要生成独立于已安装库的可执行文件,您必须静态链接它。
但是,如果应用程序的构建不是很大/不太复杂,通常最好分发源代码并在目标系统上构建/为目标系统构建,或者为最流行的变体预构建。
您不想静态链接 glibc(以及应用程序可能使用的所有其他库)的原因是,即使是最简单的应用程序也会变成大约 700K-1MB。鉴于我的发行版在 /usr/bin 中有 1900 个条目,这将使其最小约为 2GB,现在为 400MB(其中包括诸如 clang、emacs 和 skype 之类的野兽,所有非静态链接形式的重量都超过 7MB - 它们每个可能有十几个库依赖项 - 例如,如果您使用静态链接编译它,clang 会从 10MB 以下增长到 100-120MB 左右)。
当然,使用静态链接,每个应用程序的所有代码都需要作为单独的副本加载到内存中。因此,整体内存使用量大幅增加。
【讨论】: