不想让控制台在运行C++程序时出现

19

我想编写一个 C++ 程序,将 .cpp 文件编译并链接后会生成 .exe 文件。当我双击并执行这个文件时,会打开一个控制台窗口并立即关闭。我不希望出现这个控制台窗口,请帮忙解决。


也许你同时拥有一个main方法和winmain方法? - John Snow
代码#include <iostream.h>int main() { cout<<"hahahaaa"; return 0; } 代码 - Lokesh Kumar S
2
如果不在控制台中,您希望“hahahaaa”出现在哪里? - ltjax
如果我同时注释掉 "cout" 和 "#include",控制台仍然会出现。 - Lokesh Kumar S
7个回答

28

有两种方法可以让Windows程序生成控制台窗口:

  • 将程序链接为控制台子系统exe,这是向Windows发出的一个请求,始终提供关联的控制台窗口。

  • 程序代码本身创建一个控制台窗口。

第一种选项,控制台子系统,最有可能。

使用MinGW g++编译器,只需添加选项

-mwindows

如果您正在使用Visual C++编译器从命令行编译,需要添加以下选项。
/link /subsystem:windows /entry:mainCRTStartup

如果您正在使用Visual Studio,请将子系统更改为windows,并在链接器选项中将入口点更改为mainCRTStartup
对于Microsoft的编译器,可能更容易只链接一个包含WinMain函数的模块,该函数本身是非标准启动函数,并违反C++标准调用普通标准main。这是因为在GUI子系统(子系统“windows”)中,与g++等不同,Microsoft的编译器默认情况下不会识别标准main。这只是Microsoft的一件事情(大概它起源于供应商锁定)。

@Cheersandhth.-Alf:我同意,你的答案正确和完整的。我们之所以有这么长的讨论,只是因为“它最初可能是一种供应商锁定的事情”的评论。 - Larry Osterman
它曾经咬过我一次,所以在这里记录一下,“-mwindwos”技术上是一个链接器选项。 - legends2k
1
@legends2k:是的,它基本上会将“-subsystem=windows”传递给链接器。你可以通过g++选项“-Wl,-subsystem=windows”来实现这一点。虽然在编写此选项之前我快速测试了一下记住的选项,但我发现链接器的帮助文档没有指定“=”符号。因此,更准确地说,它会将“-subsystem windows”传递给链接器,你可以通过g++选项“-Wl,-subsystem,windows”来实现这一点。希望对你有帮助 :) - Cheers and hth. - Alf
更改入口点并非必须。您可以使用 editbin 更改现有可执行文件的 SUBSYSTEM 类型,或显式调用 link.exe /SUBSYSTEM:WINDOWS /ENTRY:main - jamesdlin
@jamesdlin:你的例子 link.exe /SUBSYSTEM:WINDOWS /ENTRY:main 是错误的。对于一个托管的 C++ 程序,你需要一个入口点来 /调用/ main,例如在执行命名空间范围变量的动态初始化之后。使用 Microsoft 的运行时库,mainCRTStartup 就是一个例子。 - Cheers and hth. - Alf

6
如果您想创建一个带有隐藏控制台的控制台类型程序,请将以下代码作为主要程序的第一行:
ShowWindow( GetConsoleWindow(), SW_HIDE );

4
七年后,你为我的生活减轻了一些压力。 - Jake Gaston

2

听起来你需要更新Windows Visual Studio项目设置,使其不再是控制台应用程序。

如果不是这种情况,请发布有关您的环境和工具的更多信息。


我不想使用Visual C++工具。我能否在没有VC++的情况下编写C++程序,使其可以静默执行(我不希望控制台出现)? - Lokesh Kumar S
除了Visual C++之外,我相信hmjd的回答是正确的。 - Josh Kelley

2

较弱的前提条件:

如果您的程序没有控制台子进程,只需使用FreeConsole();即可。

否则

为了避免子进程的控制台弹出窗口,需要一个(隐藏的)窗口,即如上所述

ShowWindow(GetConsoleWindow(), SW_HIDE);


1
请确保在编译和链接期间定义了_WINDOWSWINDOW(取决于您的环境)。
在命令行上,您可以按以下方式执行此操作。
cl -D_WINDOWS  program.cpp

1
在CODEBLOCKS上,除了@ravenspoint提到的之外,你还需要在你的第一行代码中添加这行代码:
#define _WIN32_WINNT 0x0501 //this is for XP

然后:

ShowWindow (GetConsoleWindow(), SW_HIDE);

0
如果您不能转移到带有图形用户界面的窗口应用程序,因为有时您可能需要使用控制台进行输出,那么您可以使用以下代码隐藏控制台窗口:
HWND hWnd = GetConsoleWindow();
ShowWindow(hWnd, SW_HIDE);

用户可以看到控制台的出现和消失。 - Lokesh Kumar S
你是如何运行这个应用程序的?是通过另一个应用程序?还是用户双击打开? - Adriano Repetti
使用CreateProcess运行“console”应用程序,在STARTUPINFO结构中设置STARTF_USESHOWWINDOW标志和SW_HIDE的wShowWindow。 (无论如何,如果您不想显示控制台,那么您真的需要创建一个_console_应用程序吗?) - Adriano Repetti
“无论如何,如果你最终不想显示控制台,你真的需要创建一个控制台应用程序吗?” - Lokesh Kumar S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接