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

Tho*_*s E 9 c linux windows

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

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

上面的"程序"应该在Windows和Linux上编译得很好,因为它与源代码兼容,因为没有特定于操作系统的库或类似的东西.

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

Sir*_*ius 22

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

在Windows上,它是可移植可执行文件格式.

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

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

此外,可执行文件仅包含在加载到内存后执行的一小部分代码.可执行文件链接到系统库,系统库提供允许程序与系统交互的大多数功能.
由于系统彼此差异很大,因此Linux的程序不能在FreeBSD上运行,尽管后者也使用ELF,因为它们没有链接到相同的库.

要在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
Run Code Online (Sandbox Code Playgroud)

  • 我想提示的是,二进制格式是关于这个问题的红色鲱鱼.真正的答案是二进制文件尝试与之交互的操作系统是不一样的,除非存在某种系统调用转换层,否则二进制文件无法运行. (2认同)