【发布时间】:2017-08-06 19:31:59
【问题描述】:
我遇到了一个 C++ 程序的问题,当我运行 .exe 时,程序会运行并且我的程序窗口会打开,但控制台会在后台在桌面上打开。我进行了谷歌搜索,发现使用 -mwindows 命令作为参数进行编译会删除控制台。它做到了。但我不确定它的实际作用,我很好奇。
【问题讨论】:
标签: c++ cmd compilation mingw
我遇到了一个 C++ 程序的问题,当我运行 .exe 时,程序会运行并且我的程序窗口会打开,但控制台会在后台在桌面上打开。我进行了谷歌搜索,发现使用 -mwindows 命令作为参数进行编译会删除控制台。它做到了。但我不确定它的实际作用,我很好奇。
【问题讨论】:
标签: c++ cmd compilation mingw
它的行为与the /subsystem:windows switch described on MSDN 完全相同。
基本上,它将入口点设置为WinMain(或wWinMain)而不是main(或wmain),这会导致没有控制台窗口并且运行一些Win32启动代码来创建传递给的参数WinMain。正如 Neil 所说,它不会阻止或启用任何你没有它就不能做的事情。
类似的开关是-municode,用于在main/WinMain 和wmain/wWinMain 之间切换,Microsoft 工具没有镜像。这些似乎会自动选择您使用的那个)。
【讨论】:
它表示您的应用程序是一个使用 Win32 API 的不需要控制台窗口的应用程序。您在编写 Windows GUI 应用程序、DLL 等时使用此选项,尽管在调试此类应用程序时控制台窗口可能很有用。即使使用此选项,如果您的应用程序动态需要一个控制台窗口,您也可以显式创建一个控制台窗口,相反,您可以从控制台应用程序调用 Win32 GUI API。
【讨论】:
在 Code::Blocks 20.03(使用 MinGW-W64 gcc 编译器项目)中,项目目标( bin/Release )使用 -mwindows 进行编译,项目目标( bin/debug )在没有 -mwindows 的情况下进行编译。调试目标不仅在可执行文件中具有调试信息,而且在后台显示控制台窗口的情况下运行。这对于调试“非常”有用,因为您的应用程序可以在您的 gui 应用程序正在处理时写入控制台调试消息......就像一个活动的调试日志。
显然,控制台对于发布目标来说是丑陋的。在 Code::Blocks 中,开关 -mwindows 在“构建目标”下的项目属性中间接设置,bin/debug 构建目标被指定为控制台应用程序,而 bin/release 目标被指定为 gui 应用程序。
回到过去(可能是八年前),有一个第 22 条规则; -mwindows 是链接 Win32 api 所必需的(但没有控制台)。如果你想要一个控制台和 Win32 api,它就不容易工作;幸运的是,今天这不是问题……您可以混合搭配。我通常在没有控制台的情况下构建我的发布目标;我使用控制台构建调试目标,并大量使用控制台进行调试。
马库斯
【讨论】: