在 MinGW 编译器中,-mwindows 命令是什么,它有什么作用?

In the MinGW compiler, what is the -mwindows command, and what does it do?

我在使用 C++ 程序时遇到问题,当我 运行 .exe 时程序会 运行 而我的程序 window 会打开,但控制台会在后台在桌面上打开。我进行了 google 搜索,发现使用 -mwindows 命令作为参数进行编译会删除控制台。它做到了。但我不确定它到底做了什么,我很好奇。

它说您的应用程序是一个使用 Win32 API 的应用程序,不需要控制台 window。在编写 Windows GUI 应用程序、DLL 等时使用此选项,尽管控制台 window 可以 在调试这些类型的应用程序时很有用。即使使用此选项,如果您的应用程序动态需要一个控制台,您也可以显式创建控制台 window,相反,您可以从控制台应用程序调用 Win32 GUI APIs。

它的行为与the /subsystem:windows switch described on MSDN完全相同。

基本上,它将入口点设置为WinMain(或wWinMain)而不是main(或wmain),这导致没有控制台window 和一些 Win32 启动代码 运行 创建传递给 WinMain 的参数。正如 Neil 所说,它不会阻止或启用任何没有它就不能做的事情。

一个类似的开关是 -municode,用于在 main/WinMainwmain/wWinMain 之间切换,Microsoft 工具未对此进行镜像。这些似乎自动 select 你使用的那个)。

在 Code::Blocks 20.03(使用 MinGW-W64 gcc 编译器项目)中,项目目标 ( bin/Release ) 使用 -mwindows 和项目目标 ( bin/debug ) 在没有 -mwindows 的情况下编译。调试目标不仅在可执行文件中有调试信息,而且它在后台暴露的控制台 window 下运行。这 'highly' 对调试很有用,因为您的应用程序可以在您的 gui 应用程序正在处理时写入控制台调试消息...就像一个活动的调试日志。 显然,控制台对于发布目标来说是丑陋的。在 Code::Blocks 中,开关 -mwindows 在 'build targets' 下的项目属性中间接设置,bin/debug 构建目标被指定为控制台应用程序,而 bin/release 目标指定为 gui 应用程序。
回到今天(也许八年前)有一个第 22 条军规; -mwindows 是 link Win32 api 所必需的(但没有控制台)。如果你想要一个控制台和 Win32 api 它并不容易工作;幸运的是,今天这不是问题……您可以混合搭配。我通常在没有控制台的情况下构建我的发布目标;我用控制台构建调试目标,我使用控制台进行大量调试。 马库斯