是二进制可执行文件便携式

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

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


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

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

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

gcc将C编译为机器代码,这意味着他的代码只能在编译它的同一架构上运行。 另外,通常存在一些与其他二进制文件的依赖关系(例如C-runtime,posix,Win32),所以如果你在Ubuntu上编译一个程序,即使它没有安装gcc,它也会在Ubuntu上运行,但它不会在Windows或其他上运行unixes(如Solaris或HPUX)。

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

只要它是相同的体系结构并具有相同的运行时库,它应该运行正常。 例如,在32位Linux上编译程序不会在64位Windows上运行,但是如果你在Ubuntu上编译程序然后把它放在另一台ubuntu机器上它应该运行正常。

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

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