为什么linux编译的程序不适用于Windows

时间:2015-08-20 11:54:09

标签: c linux windows

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

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

以上&#34;程序&#34;应该在Windows和Linux上编译就好了,因为它与源代码兼容,因为没有特定于操作系统的库或类似的东西。

然而,当我输入&#34; c99 hello.c -o hello.exe&#34;在我的Linux机器上,然后传输&#34;可执行文件&#34;到了Windows机器,它拒绝运行。根据我的理解,Linux生成一个只能在linux上运行的可执行文件,所以添加&#34; .exe&#34;没有效果。要在Linux for Windows上构建该程序,我需要在Windows机器上重新编译该程序吗? 或者还有另一种更简单的方法吗?

2 个答案:

答案 0 :(得分:22)

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

在Windows上,它是Portable Executable format

在Linux上,它是ELF (Executable and Linkable Format)

每种格式都使用了应该运行的操作系统的特性,因此它们通常无法在另一个平台上执行。

此外,可执行文件仅包含在加载到内存后执行的一小部分代码。可执行文件链接到系统库,系统库提供允许程序与系统交互的大部分功能 由于系统彼此之间存在很大差异,因此,尽管后者也使用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

答案 1 :(得分:0)

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

在.exe中,所有东西都在特定的操作系统上运行,而在Java中,虚拟机是在不同的操作系统上解释和运行代码的神奇之处。