我想在运行C ++ .exe时停止CMD

时间:2016-01-19 07:06:44

标签: c++ netbeans compiler-errors mingw

感谢您的时间。我用netbeans编写简单的C ++ hello world程序。它与netbeans一起运行良好。我用MinGW编译并运行myprogram.exe。当时它与CMD一起开放。如何阻止这个CMD?这是我的简单代码。

#include <windows.h>
int main()
{
MessageBox(NULL, "Hello world","Warning!",
        MB_ICONEXCLAMATION | MB_OK);
}

我和CMD一样。请帮我。这个编译器问题还是其他问题?enter image description here

2 个答案:

答案 0 :(得分:3)

我已经找到了你的问题的合理副本,但只找到了有关假情报答案的问题。这样:

您看到的窗口不是命令解释器,它是命令解释程序使用的的窗口。这些称为控制台窗口。您的可执行文件会生成一个新的控制台窗口,因为它默认标记为需要一个,因此当它不在控制台窗口中运行时,Windows会为它创建一个新的控制台窗口。

标记是可执行文件标题中的一个值,称为 Windows子系统,它确定Windows需要哪些基本服务,Windows应如何处理它。默认情况下,MinGW工具(以及标准代码,Microsoft的工具)使用控制台子系统生成可执行文件。通常,用于普通应用程序的唯一其他子系统是 GUI子系统,它就像控制台子系统一样,只是它说控制台窗口是必需的。

使用MinGW g ++,您可以使用半文档选项 -mwindows 来生成带有GUI子系统的可执行文件。

或者,您可以为链接器指定 [1] ,例如 -Wl,-subsystem,windows

显然,在NetBeans中,您必须修改项目属性中的编译器/链接器选项。

使用其他IDE,它可以像通过复选框或列表选择子系统一样简单。

使用MinGW工具,您可以通过objdump实用程序检查子系统。还有其他方式。但是,使用objdump

C:\my\forums\so\070>objdump -p a.exe | find /i "sub"
MajorSubsystemVersion   5
MinorSubsystemVersion   2
Subsystem               00000003        (Windows CUI)

C:\my\forums\so\070>g++ foo.cpp -mwindows

C:\my\forums\so\070>objdump -p a.exe | find /i "sub"
MajorSubsystemVersion   5
MinorSubsystemVersion   2
Subsystem               00000002        (Windows GUI)

C:\my\forums\so\070> _

使用Microsoft的工具,您可以类似地使用他们的dumpbin实用程序。

还有许多其他标头转储实用程序,但 [2] Windows本身不会显示可执行文件的子系统。

使用Microsoft的工具,没有像g ++ -mwindows这样的编译器选项,但是有一个子系统链接器选项/subsystem:windows。使用此标准和符合标准的代码,还必须将机器代码级别入口点指定为调用标准main的代码。即,链接器选项/entry:mainCRTStartup

C:\my\forums\so\070>cl std.cpp /Feb
std.cpp

C:\my\forums\so\070>dumpbin /headers b.exe | find /i "sub"
            6.00 subsystem version
               3 subsystem (Windows CUI)

C:\my\forums\so\070>cl std.cpp /Feb /link /subsystem:windows /entry:mainCRTStartup
std.cpp

C:\my\forums\so\070>dumpbin /headers b.exe | find /i "sub"
            6.00 subsystem version
               2 subsystem (Windows GUI)

C:\my\forums\so\070> _

对于在命令行中工作,使用LINK环境变量可以稍微简化一下。

许多人更喜欢使用Microsoft的monstrosity main函数替换,称为WinMain。这指导Microsoft的链接器默认采用GUI子系统。当人们希望从代码的角度来看没有意义,并且不可移植时(特别是g ++接受函数但忽略它),这使得控制器子系统很难构建 [3] 子系统提示),以及可怕的冗长。

[1] -mwindows选项通常会添加一些常用的Windows API库,而不是由简单的子系统链接器选项添加。您可以通过-dumpspecs选项转储配置来检查哪些库 [2] 我在这里谈论现代Windows。在20世纪90年代后期,Windows 9.x确实通过其(现已停止的)“快速查看”功能呈现了子系统值。对于可执行文件,显然只显示了dumpbin的完整文本输出 [3] 使用Microsoft的工具,指定了WinMain主函数和控制台子系统,默认情况下,链接器会抱怨缺少main。然后,一个修复是链接器选项/entry:WinMainCRTStartup。 功能

答案 1 :(得分:0)

忽略cmd窗口的一种方法是使用以下命令以静默方式运行它:

cmd / c yourprogram.exe

这仍将运行程序,但命令提示符不会显示。