操作系统在C ++编译过程中是否有任何作用

时间:2017-03-10 08:26:30

标签: c++ c++11

我是C ++的新手,我正在阅读这篇文章:http://www.cplusplus.com/articles/2v07M4Gy/

我很怀疑,

  • 当编译器创建* .o文件和* .exe文件时,操作系统是否有任何内容;或者是控制整个编译过程的编译器(用于该操作系统)的体系结构。
  • 其次,如果我在Windows操作系统上使用两种不同的CPU架构。 现在,我使用带有intel处理器的machine1上的C ++创建了一个sample.exe。 然后我尝试在machine2中使用其他一些CPU架构执行此sample.exe。 我的问题是,'sample.exe'文件将如何在两个不同的CPU架构上执行相同的指令。

对于使用的任何错误术语表示不满(如果有的话)。

4 个答案:

答案 0 :(得分:1)

编译器控制你得到的输出(这就是cross-compilation可能的原因),但它可能需要或可能不需要系统库/其他资源来成功执行编译。关于第二个问题,Intel和AMD处理器都实现相同的指令集(x86x86_64),因此即使内部结构非常不同,也可以在它们上执行相同的机器代码。如果要使用具有不同指令集的CPU(例如ARM),则需要为该特定CPU重新编译。

答案 1 :(得分:1)

编译器作业(与将不同目标文件和库连接到实际可执行文件的链接器协作)生成可以在系统上加载的可执行文件。显然,编译器是在托管编译器的机器上执行的进程,并且有助于服务访问文件,分配内存等,就像在机器上执行的任何其他进程一样。 “主机”可能与应用程序的目标操作系统相同,或者在嵌入式系统中,您使用“交叉编译器”,您可以在Windows机器上编译代码,然后将其安装到您的小型专用计算机 - 但对于通用软件开发,编译器位于将执行代码的同一系统上。

在大多数系统中,加载过程是操作系统本身的集成部分。在嵌入式系统中,加载过程可能是“将生成的二进制文件编程到内存中,并将代码放在正确的位置,以便您的代码负责启动整个系统”,而不是加载程序代码的windows / linux样式从文件到RAM,然后跳转到它。

只要涉及的处理器足够兼容,可执行文件就可以用于多个处理器型号,可能来自不同的制造商。 AMD和英特尔都生产使用Intel ia32(又名x86)以及最近AMD x86-64指令集的处理器,因此除了每个制造商对其处理器的少量“扩展”之外,这些处理器都采用了意图“为同一套指令做同样的事情”。执行这些指令的具体细节因制造商(以及范围内的型号)而异,但结果保证相同。

其他处理器架构(ARM,MIPS,VAX,PowerPC,HP-PA,Itanium)并不足以让另一个处理器架构能够执行它。已经有项目通过某种模拟器在架构B上运行处理器架构A,但这通常要慢很多,而且要做到这一点非常困难 - 这是一个很好的软件项目来编写这样的东西来高效工作。

答案 2 :(得分:0)

编译器接收源代码 - Ascii文件 - 并将它们转换为机器代码,二进制可执行文件。基本上该过程与平台无关,我们将一组位映射到另一组位。但可能需要进行一些OS调用才能将生成的可执行文件标记为“可执行代码”。

对于第二个问题,Windows的二进制可执行文件应该可以移植到其他Windows副本,即使它们运行在略有不同的芯片上。芯片设计为二进制兼容。然而,它并不总是很有效,有时一个版本的Windows将拒绝执行在另一个早期版本上生成的程序。如果你在谈论Windows mobile,那么重新编译将是必要的 - 手机中的芯片与PC盒不兼容。

答案 3 :(得分:0)

实际上,每个程序都使用操作系统服务,特别是(间接)通过system calls。例如,输入/输出,即读取或写入文件,通过操作系统。

  

当编译器创建* .o文件和* .exe文件时,操作系统是否有任何内容;或者是控制整个编译过程的编译器(用于该操作系统)的体系结构。

编译器正在创建和编写这些*.o object files*.exe executables。它使用操作系统来执行此操作。

当某些东西启动可执行文件时,会调用操作系统。

  

其次,如果我在Windows操作系统上使用两种不同的CPU架构。

AMD& amp;英特尔处理器是相同的 x86架构(AMD的二进制文件可以在英特尔上运行,反之亦然)当然,如果你有一些基于ARM的计算机(例如Raspberry Pi),如果你有一个Windows操作系统,你有两种不同的计算机架构。