C++ Can C++;代码只能针对特定的CPU架构进行编译。有没有办法把它编译成所有的架构

C++ Can C++;代码只能针对特定的CPU架构进行编译。有没有办法把它编译成所有的架构,c++,C++,C++编译器将您的代码编译成可执行文件(.exe),该文件包含由CPU命令组成的CPU可读机器代码。不同的CPU有不同的体系结构,可能有不同的命令。若CPU有不同的命令,那个么为我的CPU编译的可执行文件可能不会在另一台计算机上运行,而另一台CPU具有另一个体系结构和另一个命令。例如,将在SkyLakecore上编译的程序运行在KabyLakecore上,将在英特尔CPU上编译的程序运行在AMD CPU上。我说得对吗?若有的话,有并没有办法在计算机上用正确的命令安装正确的可执行文件?请同时回答示

C++编译器将您的代码编译成可执行文件(.exe),该文件包含由CPU命令组成的CPU可读机器代码。不同的CPU有不同的体系结构,可能有不同的命令。若CPU有不同的命令,那个么为我的CPU编译的可执行文件可能不会在另一台计算机上运行,而另一台CPU具有另一个体系结构和另一个命令。例如,将在SkyLakecore上编译的程序运行在KabyLakecore上,将在英特尔CPU上编译的程序运行在AMD CPU上。我说得对吗?若有的话,有并没有办法在计算机上用正确的命令安装正确的可执行文件?请同时回答示例中的问题

你说得对。编译器的输出是机器代码,不同的CPU架构有不同的指令集,需要不同的机器代码。所以x86机器代码不会在基于ARM的CPU上运行

编译器可以为运行编译器的CPU以外的CPU输出机器代码。这通常被称为“交叉编译”,所有的主要C++编译器都有一定程度的能力。 还要注意,可执行文件只是一个包含机器代码的文件。操作系统的程序加载器负责将机器代码从文件加载到内存中,并实际开始执行。因此,完全有可能在一个可执行文件中包含多个CPU体系结构的机器代码。例如,MacOS可执行文件格式通过其“通用二进制”格式支持这一点,该格式允许单个可执行文件包含PowerPC和x86 CPU的机器代码

不同的操作系统也使用不同的可执行文件格式,并具有不同的支持例程。这意味着为Windows编译的程序不会在Linux上运行,即使它们都运行在具有相同体系结构的CPU上。这就是Linux和WINE的Windows子系统,允许一个操作系统加载和执行为不同操作系统编译的程序。

为“所有体系结构”编译实际上是不可能的,因为其中一些与您期望的非常不同

我们能做的最好的事情就是编译成一个虚拟机字节码,比如Java或.NET。然后,编译后的代码可以在安装了虚拟机的任何系统上运行

Java非常通用,因此是一个不错的选择。但是,由于它的面向对象和垃圾收集的重点,因此对C++进行编译是有点棘手的。 另一个越来越流行的虚拟机是JavaScript WASM(Web Assembly),它以前是ASM.js,但现在更标准化,可以跨浏览器使用。它利用了当前所有浏览器都将JS编译成机器代码这一事实,因此WASM是JS的一种特殊形式,几乎可以一对一地编译成机器代码


是的,你是对的。在一台机器上编译另一台机器的体系结构称为交叉编译。如何做到这一点在很大程度上取决于所使用的特定编译器和所涉及的体系结构。对于某些组合,根本不可能。要交叉编译任何体系结构,您需要在计算机上安装该体系结构的工具链。为不同的编译器提供了各种交叉编译工具链。既然您指出
.exe
是一个可执行文件而不是ELF,那么您似乎是在windows上,希望在那里编译其他东西?在给定命令行开关的情况下,几乎所有编译器都可以为各种体系结构进行编译,但也可以在不同的操作系统上运行结果,这需要工具链。除了上面的注释,您是否还想完成一些特定的任务,例如为两个特定的平台进行编译?或者这只是出于好奇?另一台计算机可能首先需要不同格式的可执行文件。