【发布时间】:2010-11-04 20:49:12
【问题描述】:
编译一个C程序后,我可以把二进制可执行文件,在另一个没有加载gcc的系统上运行吗,比如Ubuntu盒子?
【问题讨论】:
-
不需要清除,你很泥泞——它会在没有 gcc 的情况下运行。
标签: c
编译一个C程序后,我可以把二进制可执行文件,在另一个没有加载gcc的系统上运行吗,比如Ubuntu盒子?
【问题讨论】:
标签: c
严格来说你不需要 gcc,但你可能需要各种库。默认情况下,语言处理器生成 dynamically linked binaries,这需要以库的形式提供广泛的运行时支持,并且必须在目标系统上找到兼容的版本,以替代您在开发主机上链接的版本。
这要求目标是相同操作系统的相似版本,例如 linux to linux。还有更微妙的版本偏差问题。在 Windows 上,这称为DLL-hell。
您可以通过static linking 将自己与许多此类问题隔离开来。这将使可执行文件变得更大,并且不再共享内存(除了自身的其他实例),但程序将能够承受更多的目标版本偏差。
【讨论】:
gcc 将 C 编译成机器代码,这意味着他的代码只能在编译它的相同架构上运行。此外,通常还存在对其他二进制文件的一些依赖项(例如 C-runtime、posix、Win32),因此如果您在 Ubuntu 上编译程序,即使它没有安装 gcc,它也会在 Ubuntu 上运行,但它不会在 Windows 或其他系统上运行unix(如 Solaris 或 HPUX)。
这是 C 与 Java 和 C# 不同的地方,其中代码被编译为虚拟机代码并在具有此语言运行时 (JVM/CLR) 的任何系统上运行。其他可移植语言是脚本语言(Perl/Python/JavaScript),脚本可以在任何有解释器的地方运行。
【讨论】:
部分正确。是的,您不需要编译器本身,但您需要 C 运行时库。无论如何,C 编译器和 C 运行时都是 POSIX 的一部分,因此没有它们你将找不到 Unix 系统。
【讨论】:
只要它是相同的架构并具有相同的运行时库,它应该可以正常运行。例如,在 32 位 Linux 上编译程序无法在 64 位 Windows 上运行,但如果您在 Ubuntu 上编译程序,然后将其放在另一台 ubuntu 机器上,它应该可以正常运行。
【讨论】:
取决于平台上安装的平台和库。已编译的可执行文件可能具有动态链接库依赖项,例如 libc,以及在编译期间链接到的任何其他内容。
涉及哪些平台/编译器,您希望将此二进制文件移至何处?
【讨论】: