什么是交叉编译器和跨平台?

时间:2009-06-23 07:56:28

标签: .net cross-platform jvm cross-compiling

我对跨平台和交叉编译器的术语感到困惑。让我首先明确跨平台。当人们谈论跨平台时,它意味着CPU的架构,即X86和X64?或OS,即Windows 32位或Windows 64(服务器或桌面)? UNIX没有64位或32位等不同的版本。为什么这样?

.NET和java是交叉编译语言,这意味着什么?当程序在.NET中编译时,我们必须选择X86,X64或Any CPU等选项。那意味着什么?同样在安装项目中,我们必须选择x86和x64之间的选项。因此,如果程序是在x86中编译的,并且在x64上创建了msi文件,它将在X64和x86上运行,还是在任何一个上运行?

5 个答案:

答案 0 :(得分:13)

  

当人们谈论跨平台时,它意味着CPU的架构,即X86和X64?或操作系统

两者。它通常意味着在虚拟机中运行的sotfware或为每个平台单独编译的软件。

  

UNIX没有64位或32位等不同的版本。

确实如此。

  

因此,如果程序是在x86中编译的,并且在x64上创建了msi文件,那么它将在X64和x86上运行,还是在任何一个上运行?

如果你的目标是x86,amd64也会运行代码(在32位模式下)。在创建安装程序msi文件的位置无关紧要。

交叉编译意味着主机和目标平台不同。例如,在Linux计算机上构建Windows软件。

答案 1 :(得分:6)

Cross-platform 是指程序在多个不同平台上运行的能力。跨平台代码经常使用各种工具包/语言来实现这一目标(Qt,Flash等)

Cross-compiler 是一个编译器,它为不同于运行编译器本身的平台的平台生成代码。嵌入式目标的编译器几乎总是交叉编译器,因为很少有嵌入式目标能够托管编译器本身。

交叉编译器需要一个构建系统,它不假定主机和目标系统是兼容的,即你不能在构建时运行目标可执行文件,例如找出生成代码的运行时方面(例如字大小) )。

(交叉编译也可以应用于编译器本身。这被称为Canadian Cross compilation,这是一种在主机上构建(交叉)编译器的技术,不同于编译器应该运行的编译器在这种情况下,我们有三个平台:

  • 构建编译器的平台(构建)。
  • 托管编译器(主机)的平台。
  • 编译器生成代码(目标)的平台。

我怀疑大多数程序员永远不会遇到这种情况。)

答案 2 :(得分:1)

我认为,跨平台可以表明它可以在Windows / Mac / * nix上运行,也可以在x86 / x86_64 / ARM / PPC上运行,但除非另有说明,否则我认为它通常意味着它在不同的操作系统。例如“Java应用程序是跨平台的”,这通常适用于Java应用程序可以在Win / Mac / * nix上运行的事实。

答案 3 :(得分:1)

'跨平台'是指在许多不同平台上工作的东西,因此可能是OS或CPU(类型(x86 / MIPS)或位大小(32/64))。这并不意味着如果需要重建才能在其他平台上运行,例如QT可以针对许多平台,但是应用程序可能需要在每个平台上进行重建,或者您可能能够构建一次,如java或.Net < / p>

'交叉编译器'是指此平台上的编译器,它使程序可以在另一个平台上运行。从而在Win32上构建WinCE可执行文件。或者您可以通过构建在Windows中运行的GCC版本在窗口框上构建Linux应用程序,但那个输出目标是Linux / Elf。如果您有嵌入式设备,则几乎总是交叉编译以构建目标可执行文件。

  

X86,X64或任何CPU。那意味着什么?   它控制着.Net应用程序是如何针对一个体系结构的,如果你的目标是它不会在两者上运行,但是编译器会进行一些优化。如果它是非目标(任何CPU),它将在两者上运行。如果您直接调用外部.dll并且您硬链接64位或32位版本,这非常有用,因此只希望您的应用程序在相同的环境中运行。

在安装程序前面,Windows 64bit可以运行32位应用程序和32位安装程序,因为64位应用程序无法在32位系统上运行。在其他平台上,您通常会重建正在运行的体系结构(Linux)的代码,或者在Mac上重新下载通用可执行文件(我认为其中有多个目标构建)

答案 4 :(得分:1)

本机编译器:本机编译器是从源代码生成可执行文件的编译器,后者又将在可用编译器的同一系统上执行。

交叉编译器:交叉编译器是那些从源代码生成可执行文件的编译器,后者将在某个不同的系统上执行,然后在哪个编译器上可用。

BoundsCheck

上查找原生代码和交叉编译器的示例