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

时间:2010-11-04 20:49:13

标签: c

编译C程序后,我可以获取二进制可执行文件,并在没有加载gcc的其他系统上运行它,例如Ubuntu框吗?

5 个答案:

答案 0 :(得分:9)

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


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

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

您可以通过static linking将自己与众多问题区分开来。这将使可执行文件变大,并且不再共享内存(除了自身的其他实例),但该程序将能够在更多的目标版本倾斜中存活。

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

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