C++ 我是在为操作系统还是处理器编码?

C++ 我是在为操作系统还是处理器编码?,c++,c,executable,native,C++,C,Executable,Native,据说,通过使用C/C++,人们可以编写“本机”程序——在平台上运行。我不知道什么是本机的——处理器体系结构还是操作系统版本 例如: 我有一个32位处理器和Windows7(32位),我编译并生成和.exe文件。它保证在任何32位Windows 7上运行吗?(在32/64位机器上赢得7 32位) Edit1: 我不打算在这里只使用Windows操作系统。我的例子也可以扩展到Linux。例如,在32位处理器上运行的32位Linux操作系统上生成一个可执行文件(默认情况下a.out),然后在64位处理

据说,通过使用C/C++,人们可以编写“本机”程序——在平台上运行。我不知道什么是本机的——处理器体系结构还是操作系统版本

例如:

我有一个32位处理器和Windows7(32位),我编译并生成和.exe文件。它保证在任何32位Windows 7上运行吗?(在32/64位机器上赢得7 32位)

Edit1: 我不打算在这里只使用Windows操作系统。我的例子也可以扩展到Linux。例如,在32位处理器上运行的32位Linux操作系统上生成一个可执行文件(默认情况下
a.out
),然后在64位处理器上的32位Linux操作系统上运行它

Edit2: 感谢您的回复,但我也希望我使用的是标准库和函数,而不是特定于操作系统的。只有一次由ANSI或ISO C++标准规定。没有对操作系统特定的窗口系统或其他库的引用。 感谢处理器体系结构(加上目标库静态或动态)

2) 对

32位windows应用程序将在windows 64位平台上运行。

如果(windows)编译器的目标体系结构是x86(32位),则它可以在任何32位和64位windows 7上运行。但如果是x86-64,它将只在64位Windows7上运行;有点

实际的指令在Windows和Linux之间并没有真正的区别,因为它们是针对单个CPU体系结构(x86)编译的

然而,二进制文件不仅仅是在裸硬件上运行的代码。例如,它还包含告诉操作系统如何加载可执行文件及其依赖项的信息。二进制文件以特定格式打包。此格式在不同的操作系统中可能不同

除此之外,操作系统还向应用程序提供一些服务(通过系统调用和API)。操作系统提供的服务及其使用方式因操作系统而异

这些原因导致了这样一个事实,即大多数情况下,本机二进制文件都依赖于它编译的操作系统和CPU体系结构


对最新问题的答复:

C++标准不需要任何关于编译目标性质的信息。它只是在源代码级别指定兼容性要求。因此,如果您坚持标准库,您就可以使用相同的源代码来编译提供一致C++实现的平台。该标准没有提到任何关于二进制可移植性的内容。如上所述,操作系统提供的基本系统调用可能会有所不同,标准库的实际实现取决于操作系统提供这些系统调用的方式


为了在Linux上运行Windows二进制文件,您需要使用类似Wine的模拟,它可以理解Windows二进制文件格式并模拟应用程序的Windows API。

为了明确回答标题,您需要为这两种格式编写代码

可执行文件包含特定于处理器的机器代码,以及操作系统关于如何加载/执行特定于操作系统的程序的大量元数据

代码还可能(通常确实)包含对操作系统定义的函数的调用。因此,尽管任何兼容的CPU都能理解这只是一个非常普通的机器代码,但它试图调用只存在于Windows上的代码

所以“土生土长”实际上意味着两者兼而有之。您为特定操作系统(以及所有兼容操作系统)和特定CPU(以及所有兼容CPU)编写代码

在Windows的情况下,您通常以特定版本的Windows为目标,然后程序将处理该版本以及未来版本的Windows


对于运行Windows(和您的程序)的处理器,可执行文件包含x86机器代码,可以在任何x86 CPU上执行,无论是来自Intel、AMD、Via还是多年来制造兼容处理器的任何人。

但无法看到您的代码,只有您可以告诉我们您是为32位还是64位平台编码-例如,如果您将指针重新解释为32位int,然后再返回到指针,则您是为32位编码,而如果您使用
int\u ptr
之类的类型,则无论您的代码是为32位还是64位计算机编译,您都是安全的。同样,为Windows桌面编码您的编码可以假定机器的endianess

如您的示例所示,如果您为32位Windows 7编译该代码,那么它也将在64位Windows 7上运行。如果使用Windows 7功能,它将不会在早期版本上运行。Microsoft非常擅长向后兼容,因此它可能会在更高版本上运行。

简短回答:不

更长:编译“本机代码”时,针对特定的处理器体系结构进行编译;MIPS、ARM、x86、68k、Sparc等。这些体系结构的字长可以是8、16、32和64(也有例外)。此外,这些体系结构可以一代一代地进行扩展,如MMX、SSE、SSE2、Neon等

您还需要考虑操作系统和您可以使用的库以及不同的调用约定。


所以,没有保证。但是如果你在Windows7上用MSVC编译,它几乎可以保证在Windows7上运行。我认为它目前只存在于x86上。

除了x86/x86-64之外,windows不会运行其他任何东西吗?@tobyodavies相当于取决于您是否包括windows NT(DEC Alpha)、windows Phone 7(ARM Cortex 7)、windows Embedded(x86、ARM、SuperH(我以前从未听说过))。。。Windows CE也在MIPS上运行。+1用于解释平台编码和编译之间的区别。+1用于说明“二进制兼容性”。但我指的不是跨平台二进制兼容性——我指的是Windows上的Windows二进制文件和Linux上的Linux二进制文件(尽管在不同的