我想在 运行 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
。
感谢您的宝贵时间。我用 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
。