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

6
我对跨平台和交叉编译的术语有些困惑。首先让我们清楚跨平台的概念。当人们谈论跨平台时,是指CPU的架构,即X86和X64?还是操作系统,即Windows 32位或Windows 64位(服务器或桌面)?UNIX没有像64位或32位这样的不同版本。为什么呢?
.NET和Java是跨编译语言,这是什么意思?当程序在.NET中编译时,我们必须选择选项,如X86、X64或任何CPU。那是什么意思?此外,在设置项目中,我们必须在x86和x64之间选择选项。因此,如果程序在x86上编译,并且msi文件在x64上创建,它会在X64和x86上运行,还是只能在其中一种上运行?
5个回答

13
当人们谈论跨平台时,它通常指CPU的架构,即X86和X64还是操作系统。这两者都是。它通常指在虚拟机中运行的软件或为每个平台单独编译的软件。
UNIX确实有不同的版本,如64位或32位。
因此,如果程序被编译为x86并在x64上创建了msi文件,它会在X64和x86上运行,还是仅在其中一个上运行?如果你针对x86,amd64也会以32位模式运行代码。创建安装程序msi文件的位置不应该很重要。
交叉编译意味着主机和目标平台不同。例如,在Linux计算机上构建Windows软件。

你应该说,amd64只是今天大多数64位x86 CPU的名称(除了Itanium)。有些人可能会认为你指的只是AMD CPU ;) - ivan_ivanovich_ivanoff

6

跨平台 是指程序能够在多个不同的平台上运行的能力。跨平台代码通常使用各种工具包/语言来实现(如Qt、Flash等)。

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

交叉编译器需要一个构建系统,该系统不假定主机和目标系统兼容,例如不能在构建时运行目标可执行文件,以确定所生成代码的运行时方面(例如字长)。

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

  • 编译器构建平台(build)。
  • 托管编译器的平台(host)。
  • 编译器生成代码的平台(target)。

我怀疑大多数程序员永远不会遇到这个问题。


1

本地编译器:本地编译器是从源代码生成可执行文件的编译器,这些可执行文件将在编译器所在的同一系统上执行。

交叉编译器:交叉编译器是从源代码生成可执行文件的编译器,这些可执行文件将在与编译器不同的系统上执行。

BoundsCheck上找到本地和交叉编译器的示例。


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

1
“跨平台”是指在许多不同的平台上运行的事物,这可能是操作系统或CPU(类型(x86/MIPS)或位数(32/64))。这并不意味着需要重新构建才能在其他平台上运行,只是可以,例如QT可以针对许多平台,但您的应用程序可能需要在每个平台上重新构建,或者您可以像Java或.Net一样构建一次。
“交叉编译器”是指在此平台上的编译器,可以制作可在另一个平台上运行的程序。因此,在Win32上构建WinCE可执行文件。或者您可以通过构建在Windows中运行的GCC版本来在窗口框中构建Linux应用程序,但其输出目标是Linux / Elf。如果您有嵌入式设备,您几乎总是进行交叉编译以构建目标可执行文件。
“X86,X64或任何CPU。那是什么意思? 它控制如何将.Net应用程序定位到一个架构或不定位,如果您定位,则不会在两者上运行,但编译器可能会进行一些优化。如果是非目标(任何CPU),则会在两者上运行。这主要有用,如果您直接调用外部.dll,并且硬链接64位或32位版本,因此只想使您的应用程序在相同的环境中运行。”
在安装程序方面,Windows 64位可以运行32位应用程序和32位安装程序,而64位应用程序无法在32位系统上运行。在其他平台上,通常需要为正在运行的架构(Linux)重新构建代码,或者在Mac上下载通用可执行文件(我认为其中包含多个目标构建)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接