是二进制可执行文件可移植

use*_*831 6 c

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

Dig*_*oss 9

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


严格来说,你不需要gcc,但你可能需要各种库.默认情况下,语言处理器生成动态链接的二进制文件,这需要以库的形式提供大量的运行时支持,并且必须在目标系统上找到兼容的版本,可以替换在开发主机上链接的版本.

这要求目标是相同操作系统的类似版本,例如linux到linux.版本偏斜有更微妙的问题.在Windows上,这被称为DLL-hell.

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


Mot*_*tti 5

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

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

  • @user481831 每个 shell 脚本都指定哪个脚本引擎应该运行它(在 [shebang](http://en.wikipedia.org/wiki/Shebang_%28Unix%29) 行中) (2认同)

Let*_*_Be 3

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