为什么Linux编译的程序不能在Windows上运行

我几乎可以肯定,我的问题是由于编译的程序编译为一个可执行文件,但我只是想仔细检查这一事实。

#include <stdio.h> #include <stdlib.h> int main() { printf("Hello world!\n"); return EXIT_SUCCESS; } 

上面的“程序”应该在Windows和Linux上编译,因为它是源代码兼容的,因为没有操作系统特定的库或类似的东西。

然而,当我在我的Linux机器上input“c99 hello.c -o hello.exe”,然后将这个“可执行文件”传送到Windows机器上时,它拒绝运行。 据我所知,Linux生成一个只能在linux上运行的可执行文件,所以添加“.exe”没有任何作用。 要在Linux for Windows上构build该程序,我需要在Windows机器上重新编译该程序? 还是有另一个更简单的方法,将工作?

Solutions Collecting From Web of "为什么Linux编译的程序不能在Windows上运行"

Windows和Linux可执行文件使用两种不同的不兼容格式:

在Windows上,它是可移植的可执行格式 。

在Linux上,它是ELF(可执行和可链接的格式) 。

每种格式都使用它们应该运行的操作系统的特性,所以它们通常不能在另一个平台上执行。

此外,可执行文件只包含一小部分代码,它在加载到内存之后执行。 一个可执行文件被链接到系统库,这些系统库提供了允许程序与系统进行交互的大部分功能。
由于系统之间存在很大差异,因此库文件不尽相同,即使FreeBSD使用ELF程序,也不能在FreeBSD上运行Linux程序,因为它们没有链接到相同的库。

要在Linux上编译Windows可执行文件,可以使用一种称为交叉编译的技术。 编译器毕竟只是一个写入二进制文件的程序,所以任何编译器在理论上都可以为任何平台编写代码,只要目标系统的库可以链接即可。

MinGW-w64项目提供了一个允许这个工具链。 例如,您可以使用sudo apt-get install mingw-w64命令将其安装在基于debian的系统上。

安装的可执行文件可以像这样使用:

 i686-w64-mingw32-gcc hello.c -o hello32.exe # 32-bit x86_64-w64-mingw32-gcc hello.c -o hello64.exe # 64-bit 

它的编译情况,与java .exe不同的是没有任何虚拟机来解释不同操作系统中的代码。 然后,他需要从操作系统中获取所有特定的.dll和lib来执行所做的工作。

在.exe中,所有的东西都是在特定的操作系统上运行的,Java中的其他方式是虚拟机在不同操作系统上解释和运行代码的魔法。