我几乎可以肯定我的问题是因为编译的程序被编译为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)