如何使用GCC和Linux子系统为Windows编译可执行文件?

如何使用GCC和Linux子系统为Windows编译可执行文件?,c,bash,gcc,C,Bash,Gcc,Windows 10周年更新包括Ubuntu的Linux子系统。我使用sudo apt get install gcc安装了gcc 出于测试目的,我编写了一些简单的C代码: #include <stdio.h> int main(void){ printf("Hello\n"); return 0; } #包括 内部主(空){ printf(“Hello\n”); 返回0; } 并使用gcc-cmain.c对其进行编译,但会生成execute(仅限Linux)ma

Windows 10周年更新包括Ubuntu的Linux子系统。我使用
sudo apt get install gcc
安装了gcc

出于测试目的,我编写了一些简单的C代码:

#include <stdio.h>
int main(void){
    printf("Hello\n");
    return 0;
}
#包括
内部主(空){
printf(“Hello\n”);
返回0;
}
并使用
gcc-cmain.c
对其进行编译,但会生成execute(仅限Linux)
main.o
。如果我运行它
/main.o
,它会显示
Hello


我的问题是,如何编译
main.c
,以便Windows可以运行它?基本上,如何在Linux子系统中使用GCC生成
*.exe
文件?

如果在Linux上使用GCC编译,它将生成ELF文件,而不是PE(windows理解的)文件


要在linux内部为windows编译程序,可以使用mingw

Linux子系统作为Linux计算机工作。您只能在其中运行Linux可执行文件,默认情况下,
gcc
创建Linux可执行文件

要创建Windows可执行文件,您需要安装mingw交叉编译器:

sudo apt-get install mingw-w64
然后,您可以使用以下命令创建32位Windows可执行文件:

i686-w64-mingw32-gcc -o main32.exe main.c
x86_64-w64-mingw32-gcc -o main64.exe main.c
和64位Windows可执行文件,包括:

i686-w64-mingw32-gcc -o main32.exe main.c
x86_64-w64-mingw32-gcc -o main64.exe main.c

请注意,这些Windows可执行文件不会在Linux子系统内部工作,只能在Linux子系统外部工作。

编译Windows exe
…它们是否已经可执行?您的问题(至少对我来说)有点不清楚。你能提供更多的信息,概述为什么你得到的与你期望的不同吗。还要注意的是,通过将
-c
选项传递给编译器,您明确地告诉它只执行编译步骤——并且不要通过链接生成可执行文件。@G.M.如果我想获得
*.exe
文件,我应该这样做吗
gcc-o main.exe main.c
?事实上,当我这样做并尝试运行这个输出文件
main.exe
时,我得到了这个消息,您是否尝试在Linux子系统内部或外部运行它?因为这似乎完全是Linux系统,在linux中编译windows可执行文件需要一个交叉编译器。gcc的手册页似乎暗示有一些选项可用于制作windows控制台和带窗口的EXE。他们为什么不工作-mconsole-mwindowsI在创建Windows应用程序方面没有太多经验,所以我不知道这些编译器选项的细节。尽管如此,这些特定于Windows的选项将只适用于*-mingw32 gcc编译器,而不适用于创建Linux可执行文件的默认gcc。似乎x86_64-w64-mingw32-gcc已更改,因此它被设计为使用Windows C运行时(MSVCRT.DLL)和其他核心Windows库,而不是标准的C libs gcc链接(可能是/lib中的任何内容?)。它似乎可以工作,但如果.c需要一个.txt文件作为参数,如何将文件编译为.exe?我怀疑这是否完全正确。它说“需要”使用mingw。当然这只是一个选项。众所周知,GCC能够在任何东西之间交叉编译,所以它也可以在x86 ELF系统上交叉编译x86 PE?我不知道如何做到这一点,但如果这是不可能的,那似乎令人震惊。