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