据说通过使用C / C ++,可以编写在平台上运行的“本机”程序。我对什么被认为是本机 - 处理器架构或操作系统版本感到困惑?
例如:
我有一个32位处理器和Windows 7(32位),我编译并生成.exe文件。它可以保证在任何Windows 7 32位上运行吗? (在32/64位机器上赢得7位32位)
EDIT1 :
我不打算只在这里使用Windows操作系统。我的例子也可以扩展到Linux。例如,在32位处理器上运行的32位Linux OS上生成可执行文件(默认为a.out
),然后在64位处理器上的32位Linux上运行它。
EDIT2 : 感谢您的回复,但我也打算使用标准库和函数 - 没有特定于操作系统。只是ANSI或ISO C ++标准规定的一次。没有对OS特定窗口系统或其他库的引用。 感谢
答案 0 :(得分:20)
两者;那种。
实际指令在Windows和Linux之间并没有真正区别,因为它们是针对单CPU架构(x86)进行编译的。
但是,二进制文件不仅仅是在裸硬件上运行的代码。例如,它还包含告诉操作系统如何加载可执行文件及其依赖项的信息。二进制文件以特定格式打包。这种格式在不同的操作系统中可能有所不同。
除此之外,操作系统还为应用程序提供了一些服务(通过系统调用和API)。操作系统提供的服务及其使用方式因操作系统而异。
这些原因促使大多数情况下本机二进制文件依赖于它编译的操作系统和CPU架构。
回答更新后的问题:
C ++ Standard不需要编译目标的性质。它只是在源级别指定兼容性要求。因此,如果您坚持使用标准库,您将能够使用相同的源代码在提供符合C ++实现的平台上进行编译。该标准没有说明二进制可移植性。如上所述,操作系统提供的原始系统调用可能会有所不同,标准库的实际实现取决于操作系统提供的系统调用方式。
为了在Linux上运行Windows二进制文件,您需要使用某种类似于Wine的仿真,它可以理解Windows二进制格式并为应用程序模拟Windows API。
答案 1 :(得分:2)
答案 2 :(得分:1)
如果您的(windows)编译器的目标体系结构是x86(32位),那么它可以在任何32位和64位Windows 7上运行。但是如果它的x86-64,它只能在64位Windows 7上运行。 / p>
答案 3 :(得分:1)
要具体回答标题,请为两者编码。
可执行文件包含特定于处理器的机器代码,以及操作系统关于如何加载/执行程序的大量元数据,这些特定于操作系统。
代码也可能(并且通常会)包含对OS定义的函数的调用。因此,虽然它只是完全普通的机器代码,任何兼容的CPU都能理解,但它会尝试调用仅存在于Windows上的代码。
所以“本土”真的意味着两者兼而有之。您可以为特定的操作系统(以及所有兼容的操作系统)和特定的CPU(以及所有兼容的CPU)编写代码。
对于Windows,您通常会定位特定版本的Windows,然后该程序将在该版本以及Windows的未来版本上运行。
对于运行Windows(和您的程序)的处理器,可执行文件包含x86机器代码,可以在任何 x86 CPU上执行,无论是来自Intel,AMD,Via还是谁多年来,其他公司也制造了兼容的处理器。
答案 4 :(得分:0)
无法看到您的代码,只有您可以告诉我们您是在编码32位还是64位平台 - 例如,如果您将指针重新解释为一个32位int然后返回指针,您编写的是32位编码,而如果使用int_ptr
这样的类型,则无论您的代码是针对32位还是64位计算机编译都是安全的。同样,对Windows桌面进行编码,您的编码可以假设机器的字节顺序。
如果在您的示例中,您编译 32位Windows 7的代码,那么它也将在64位Windows 7上运行。如果您使用Windows 7功能,它将不会在早期版本上运行。 Microsoft非常擅长向后兼容性,因此它可能会在更高版本上运行。
答案 5 :(得分:0)
简短回答:不。
更长:编译“本机代码”时,编译特定的处理器体系结构; MIPS,ARM,x86,68k,Sparc等。这些体系结构的字长可以是8,16,32和64(也有例外)。这些架构也可以代代相传,如MMX,SSE,SSE2,Neon等。
此外,您还需要考虑操作系统以及可以使用的库以及不同的调用约定。
所以,没有保证。但是如果你在Windows 7上使用MSVC进行编译,它的几乎保证在Windows 7上运行。我认为它目前仅适用于x86。