【问题标题】:is binary executable file portable是二进制可执行文件可移植
【发布时间】:2010-11-04 20:49:12
【问题描述】:

编译一个C程序后,我可以把二进制可执行文件,在另一个没有加载gcc的系统上运行吗,比如Ubuntu盒子?

【问题讨论】:

  • 不需要清除,你很泥泞——它会在没有 gcc 的情况下运行。

标签: c


【解决方案1】:

技术上:可以,但如果您需要最大的可移植性,请使用静态链接


严格来说你不需要 gcc,但你可能需要各种库。默认情况下,语言处理器生成 dynamically linked binaries,这需要以库的形式提供广泛的运行时支持,并且必须在目标系统上找到兼容的版本,以替代您在开发主机上链接的版本。

这要求目标是相同操作系统的相似版本,例如 linux to linux。还有更微妙的版本偏差问题。在 Windows 上,这称为DLL-hell

您可以通过static linking 将自己与许多此类问题隔离开来。这将使可执行文件变得更大,并且不再共享内存(除了自身的其他实例),但程序将能够承受更多的目标版本偏差。

【讨论】:

  • +1 获取有关此主题的最佳建议。不幸的是,现在不可能使用 glibc 进行静态链接。如果您的系统有 eglibc,那么您的状态会更好,但仍然存在 libnss_* 问题。如果您可以设置一个环境来针对 uClibc 构建您的应用程序,那么这将最适合分发静态二进制文件。
  • 我不愿质疑 +1 评论,但我只是在 CentOS 5.4 和 5.5 上静态链接 hello world。我的 a.out 从 4,376 字节膨胀到 538,241,但它起作用了。它现在在哪个系统上失败了?
  • 你确定 CentOS 还在使用 glibc 吗?许多发行版已经切换到 eglibc 分叉,主要是因为 glibc 维护者的“个性问题”——同时它们也受益于半途而废的静态链接。
  • CentOS 几乎是 RHEL 的镜像,作为服务器发行版,它几乎与“前沿”相反。
【解决方案2】:

gcc 将 C 编译成机器代码,这意味着他的代码只能在编译它的相同架构上运行。此外,通常还存在对其他二进制文件的一些依赖项(例如 C-runtime、posix、Win32),因此如果您在 Ubuntu 上编译程序,即使它没有安装 gcc,它也会在 Ubuntu 上运行,但它不会在 Windows 或其他系统上运行unix(如 Solaris 或 HPUX)。

这是 C 与 Java 和 C# 不同的地方,其中代码被编译为虚拟机代码并在具有此语言运行时 (JVM/CLR) 的任何系统上运行。其他可移植语言是脚本语言(Perl/Python/JavaScript),脚本可以在任何有解释器的地方运行。

【讨论】:

  • 是的,我明白了!如果我写一个 shell 脚本会怎样,它取决于 shell 的类型吗?例如:c、korn、bourn 我是对的
  • @user481831 每个 shell 脚本都指定应该运行哪个脚本引擎(在 shebang 行中)
【解决方案3】:

部分正确。是的,您不需要编译器本身,但您需要 C 运行时库。无论如何,C 编译器和 C 运行时都是 POSIX 的一部分,因此没有它们你将找不到 Unix 系统。

【讨论】:

  • 这个答案具有误导性,因为它听起来像是不同的库实现可以互换。
【解决方案4】:

只要它是相同的架构并具有相同的运行时库,它应该可以正常运行。例如,在 32 位 Linux 上编译程序无法在 64 位 Windows 上运行,但如果您在 Ubuntu 上编译程序,然后将其放在另一台 ubuntu 机器上,它应该可以正常运行。

【讨论】:

    【解决方案5】:

    取决于平台上安装的平台和库。已编译的可执行文件可能具有动态链接库依赖项,例如 libc,以及在编译期间链接到的任何其他内容。

    涉及哪些平台/编译器,您希望将此二进制文件移至何处?

    【讨论】:

      猜你喜欢
      • 2016-02-25
      • 1970-01-01
      • 1970-01-01
      • 2016-12-29
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 2014-09-19
      相关资源
      最近更新 更多