我在用 C 编写的简单数学工具中使用 stdio.h 、 string.h 、 math.h 。
我听说 gcc 中的 -static 实际上并不总是静态编译库(我从我不理解的 Linux-pro 术语中听到这个)而且我还从相同的消息来源中听说,Linux 的软件开发由于碎片化和不同的发行版需要为每个发行版重新编译。
由于我没有做 GUI 或自定义库,或者任何太复杂的东西,我假设我不必为每个发行版再次编译,并且在我的 Ubuntu 20.04 系统上编译时在 gcc 中静态链接 -static 将创建一个可执行的二进制文件与几乎所有 x86_64 Linux 系统兼容。我对吗 ?它至少可以在 Debian、Ubuntu、Arch 及其衍生产品上运行吗?
我看到了来自 Android Authority 的 Garry 的视频,他静态编译了他在 Raspberry Pi 上制作的 C 程序并在 Android 上运行它,所以我猜这是可能的。
最佳答案
即使静态链接,glibc 库仍然使用一些动态特性。这可能适用于较旧的发行版,因为诸如 NSS(名称服务切换)之类的东西已经存在很长时间了。
如果你想真正保持静态,你应该使用 uclibc 或其他类似的微型 C 库。但是,如果系统使用功能覆盖 DNS、用户 ID(如在 LDAP 中查找用户)、主目录位置等,它们将无法工作。
那么还有另一个问题:内核支持。如果您在一个非常新的内核上构建静态库,则该库可能已构建为使用来自新版本的系统调用,如果您使用足够旧的发行版,这些系统调用可能不存在。像 2.4、2.6 或 3.X 这样的内核肯定会缺少系统调用。
关于c - 将 -static 与 GCC 一起使用可以保证我的 C 程序可以跨 x86 发行版运行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62928306/