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

80

Windows 10 周年更新版包含了适用于 Ubuntu 的 Linux 子系统。我使用 sudo apt-get install gcc 命令安装了 gcc。

我编写了一些简单的 C 代码进行测试:

#include <stdio.h>
int main(void){
    printf("Hello\n");
    return 0;
}

我使用gcc -c main.c编译完成,但只生成了(Linux系统上)可执行的main.o文件。如果我运行./main.o,它会显示Hello

我的问题是,怎样编译main.c才能在Windows系统上运行?基本上,在Linux子系统中,如何用GCC生成一个*.exe文件?


1
编译 Windows 可执行文件...它们不是已经可执行了吗? - Sourav Ghosh
2
你的问题(至少对我来说)有点不清楚。你能提供更多信息,概述一下为什么你得到的结果与你期望的不同吗?另请注意,通过向编译器传递“-c”选项,您明确告诉它仅执行编译步骤 - 而不通过链接生成可执行文件。 - G.M.
你尝试在Linux子系统内部还是外部运行它了吗? - Markus Laire
@MarkusLaire 是的,它可以在Linux子系统中工作。但是我该如何专门为Windows平台编译呢? - Mikhail
2
由于这似乎是完全的Linux系统,您需要使用交叉编译器在Linux中编译Windows可执行文件。 - Markus Laire
显示剩余8条评论
2个回答

134

Linux子系统像一个Linux计算机一样工作。您只能在其中运行Linux可执行文件,而默认的gcc创建Linux可执行文件。

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

sudo apt-get install mingw-w64

然后您可以使用以下命令创建32位Windows可执行文件:

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

64位Windows可执行文件,包括:

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

请注意,这些Windows可执行文件无法在Linux子系统内运行,只能在其外部运行。


gcc 的 man 页面似乎意味着有一些选项可以制作 Windows 控制台和窗口程序。它们不能正常工作的原因是什么? -mconsole -mwindows - sam msft
1
我没有太多创建Windows应用程序的经验,所以我不知道这些编译器选项的详细信息。但是,那些特定于Windows的选项只能与*-mingw32-gcc编译器一起使用,而不能与默认的gcc一起使用,后者用于创建Linux可执行文件。 - Markus Laire
1
我怀疑这并不完全正确。它说你“需要”使用mingw。当然,那只是其中一种选择。众所周知,GCC应该能够在任何系统之间进行交叉编译,因此它肯定也可以在x86-ELF系统上交叉编译x86-PE吧?虽然我不知道如何操作,但如果这是不可能的,那就太令人震惊了。 - hippietrail
谢谢,它正在工作。可惜没有关于mingw-w64的文档。 @MarkusLaire mingw-w64有man手册吗?我找不到任何相关的。 - undefined
@YGautomo 我只在简单的事情上使用过mingw,对我来说gcc的文档已经足够了:https://gcc.gnu.org/onlinedocs/ - undefined
显示剩余3条评论

11
如果你在Linux上使用gcc进行编译,会生成一个ELF文件而不是Windows所理解的PE文件。
要在Linux内部为Windows编译程序,可以使用mingw。

如何使用mingw将cpp文件编译为exe - user15375057

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接