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

I want to stop CMD when run C++ .exe

感谢您的宝贵时间。我用 netbeans.It 编写了简单的 C++ hello world 程序,与 netbeans 配合得很好。我用 MinGW 和 运行 myprogram.exe 遵守了它。那时它是用CMD打开的。如何停止这个CMD?这是我的简单代码。

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

以及我附加的 CMD。请帮我。这是编译器问题还是其他问题?

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

cmd /c yourprogram.exe

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

我已经为您的问题寻找了一个合理的副本,但只找到了带有虚假答案的问题。所以:

你看到的window不是命令解释器,它是命令解释器使用的种类的window。这些被称为 console windows。您的可执行文件会生成一个新的控制台 window,因为它在默认情况下被标记为需要一个,因此当它不是来自控制台 window 中的 运行 时,Windows 会为它。

标记是可执行文件的header中的一个值,称为Windows子系统,它决定了它需要从[=106=得到哪些基本服务],Windows应该如何对待它。默认情况下,MinGW 工具(对于标准代码,还有 Microsoft 的工具)会生成带有 控制台子系统 的可执行文件。通常用于普通应用程序的唯一其他子系统是 GUI 子系统,它类似于控制台子系统,只是它说控制台 window 不是 必填。

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

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

显然,在 NetBeans 中,您必须修改项目属性中的 compiler/linker 选项。

对于其他 IDE,它可以像通过 check-box 或在列表中选择子系统一样简单。


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

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

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

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

C:\my\forums\so0> _

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

还有许多其他 header 转储实用程序,但 [2]Windows 本身并不提供可执行文件的子系统。


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

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

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

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

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

C:\my\forums\so0> _

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

许多人更喜欢使用 Microsoft 的怪异 main 函数替换,称为 WinMain。这会引导 Microsoft 的链接器默认采用 GUI 子系统。它使 [3] 在需要时使用控制台子系统构建变得更加困难,从代码的角度来看是没有意义的,并且是 non-portable(特别是,g++ 接受函数但忽略了它的子系统提示),以及非常冗长。


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