C ++编译器将您的代码编译成可执行文件(.exe),该文件包含由CPU命令组成的CPU可读机器代码。不同的CPU具有不同的体系结构和可能不同的命令。如果CPU具有不同的命令,则为我的CPU编译的可执行文件可能无法在具有另一种具有另一种体系结构和另一条命令的CPU的另一台计算机上运行。对于例如将程序编上SKYLAKE微架构核心运行KabyLake核心,并计划在编译英特尔CPU上运行的AMD CPU。我对吗?如果是这样,有什么方法可以在计算机上用正确的命令安装正确的可执行文件?还请举例回答问题。
你是对的。编译器的输出是机器代码,并且不同的CPU体系结构具有不同的指令集,需要不同的机器代码。因此,x86机器代码将无法在基于ARM的CPU上运行。
编译器可能会输出CPU的机器代码,而不是正在运行的CPU。通常将其称为“交叉编译”,并且所有主要的C ++编译器都在某种程度上具有此功能。
还要注意,可执行文件只是包含机器代码的文件。操作系统的程序加载器负责将机器代码从文件加载到内存中,并开始实际执行。因此,在一个可执行文件中完全有可能具有用于多种CPU架构的机器代码。例如,MacOS可执行文件格式以其“通用二进制”格式支持该格式,该格式允许单个可执行文件包含PowerPC和x86 CPU的机器代码。
不同的操作系统还使用不同的可执行文件格式,并且具有不同的支持例程。这意味着为Windows编译的程序不会在Linux上运行,即使它们都在具有相同体系结构的CPU上运行也是如此。这就是诸如Linux和WINE的Windows子系统之类的东西出现的地方,它允许一个OS加载并执行为另一OS编译的程序。