如何制作可移植的可执行文件?

时间:2010-11-03 11:11:08

标签: c++ c executable portability

有没有办法编译c / c ++源文件来输出可以在不同计算机上的其他处理器上运行的.exe文件? 我问这个用于Windows平台。 我知道它可以用java或c#完成,但它使用的是虚拟机。

PS:对于那些说只能用虚拟机完成或者必须在每台机器上编译源代码的人,我问的是所有病毒是用java还是c#编写的,你需要一台vm机器才能被感染或者你需要在你的机器上编译蠕虫的源代码来感染? (我不想制造病毒,但这是一个很好的例子:))

12 个答案:

答案 0 :(得分:22)

不同的计算机使用不同的指令集,OS系统调用等,这就是机器代码是特定于平台的原因。这就是为什么开发了各种技术,如字节码,虚拟机等,以允许可移植的可执行文件。但是,通常C / C ++直接编译为特定于平台的机器代码。

因此,如果没有某种仿真层,Windows exe将无法在另一个平台上运行。

但是,您可以使C / C ++ 源代码可移植。这意味着,要使应用程序在另一个平台上运行,您需要做的就是为该平台编译它。

答案 1 :(得分:13)

是的,你可以,但这不一定是个好主意。

当苹果公司在90年代早期从摩托罗拉68000迁移到PowerPC芯片时,我们提出了fat binary的想法(我不是说他们发明了它,这只是我所知道的最早的化身) 。该链接还描述了FatELF Linux通用二进制文件,但鉴于我们对它们的了解甚少,它们似乎没有起飞。

这是一个单独的文件,它基本上包含捆绑在一个文件中的68000和PowerPc可执行文件,并且需要操作系统中的一些智能,因此它可以加载并执行相关的文件。

如果你是如此倾向,你可以编写一个编译器来生成一个可以在很多平台上运行的胖二进制文件,但是:

  • 它会非常大;和
  • 几乎可以肯定每个目标系统都需要特殊的加载器。

由于gcc对不同的平台和交叉编译有如此大量的支持,所以我会集中精力,我是否疯狂尝试: - )

答案 2 :(得分:3)

简短的回答是 - 你做不到。更长的答案是用便携式(标准)C / C ++编写,并在您需要的平台上编译。

答案 3 :(得分:1)

但是,您可以使用其他语言进行操作。如果您需要在多个平台上运行某些东西,我建议您调查Java。与c / c ++类似的语言,你可以“编译”(某种程序)程序,几乎可以在任何计算机上运行。

答案 4 :(得分:1)

不要将处理器平台与OS平台混淆。 对于不同的操作系统平台,机器二进制文件完全不同。甚至不可能制作一对一的指令映射器。因为整个指令集架构可能不同,并且不同的指令组可能具有完全不同的指令格式,甚至一些指令可能丢失或者目标平台。 只有模拟器或虚拟机才能执行此操作。

答案 5 :(得分:0)

实际上,一些操作系统支持这一点;它通常被称为“fat binary”。

特别是,Mac OS使用(使用)它来支持一个二进制文件中的PowerPC和x86。

但是在MS Windows上,这是不可能的,因为操作系统不支持它。

答案 6 :(得分:0)

这样做的诀窍是创建一个包含机器指令的二进制文件,这些指令将在您要支持的操作系统和处理器上的虚拟机中进行模拟。

最广泛传播的此类虚拟机是Java虚拟机的变体。所以我的建议是查看compiles C code to Java byte code

的编译器

此外,Windows曾经在其他(Alpha)架构上处理x86 as a virtual machine

答案 7 :(得分:0)

Windows可以在64位模式下运行32位可执行文件,没有任何问题。因此,如果您在32位模式下编译它,您的exe将是可移植的。否则,您必须发布2个版本的可执行文件。如果您使用Java或C#(或任何字节码编译语言),JIT /解释器可以优化您当前操作系统模式的代码,因此它是完全可移植的。但是在C ++上,由于它生成本机代码,我担心除了使用2个版本的二进制文件之外不能这样做。

答案 8 :(得分:0)

总结其他答案,如果您想创建一个可以在多个平台上加载和运行的单个可执行文件,您基本上有两个选择:

  1. 创建“胖二进制”,其中包含多个平台的机器代码。大多数开发工具通常不支持这一点,并且可能需要在目标平台上使用特殊的加载器;

  2. 编译为JVM或.Net的字节代码。我听说过一个生成Java字节代码的C编译器(不能记得这个名字),但从未使用它,也不知道实现的质量是什么。

  3. 通常,在C中支持多个平台的过程是通过使用交叉编译器或在每个平台上运行编译器为每个目标生成不同的可执行文件。这需要您考虑如何编写和组织源代码,以便可以轻松地交换特定于平台的位,而不会影响整个程序逻辑,从而“不同程度地”轻松“。

答案 9 :(得分:0)

简短的回答是你不能,答案很长,有几种选择。

  1. 胖二进制。缺点是这需要操作系统支持。我所知道的唯一支持它的用户级操作系统是OS X,用于移植英特尔的电源。
  2. 动态交叉翻译。正如Transmeta和Apple所使用的那样。我再也不知道一般的解决方案提供商。
  3. 一个C \ C ++解释器。至少有一个我知道Ch。它运行在Windows,Linux,OS X上。注意Ch不完全兼容C ++。

答案 10 :(得分:0)

这个问题喜欢这样问:“有没有办法可以从加拿大到世界其他城市?”

答案是:“是的。”

用于在没有任何虚拟机的Windows平台上将C / C ++源代码编译为可执行文件,您可以使用Windows Legacy API或MFC(特别是在静态库中使用MFC而不是在Dll中)。这个可执行文件几乎可以在所有拥有Windows的PC上运行,因为Windows只能在3个平台上运行(x86,x64,IA64;除了支持ARM的Windows 8和8.1)。当然你应该将你的源代码编译成x86代码来运行32位和x86-64平台和Itanium可以在仿真中运行您的exe。但是关于运行Windows作为其操作系统的所有处理器(如移动设备中的ARMS),您应该为Windows Phone或Windows CE编译它。

答案 11 :(得分:-1)

您可以编写一个中间库〜,例如:

      [ Library ]

     [ mid-library]

[linux part] [windows part]

然后,你可以使用库,你的应用程序将是可移植的~~