什么原因导致std::cout没有输出任何内容?

16

由于某种原因,我的应用程序中 std::cout 无法显示任何内容。我使用 Qt Creator 开发 Qt 应用程序,但是由于我的计算机是 XP64 系统,因此不能从我的计算机上启动 Qt Creator。我目前正在使用 Visual Studio 2008 和 Qt 插件(通过导入 .pro 项目文件)进行开发。一切看起来都很好,应用程序也可以正常运行。

在某些情况下(取决于命令行参数),我不想启动 HIM,只想在 CLI(例如命令行必须参数)中显示几个句子。

我没有收到任何错误消息,但没有显示任何内容。对应的代码如下,我可以确定它已经被执行了:

std::cout << "is this going to be displayed ?" << std::endl;

你有什么想法,为什么没有东西显示出来?


为什么不在这一行设置一个断点,看看这段代码是否真的被执行了呢?它被执行了吗? - Mihir Mehta
我曾经遇到过类似的问题,但那是因为我写成了std::cout << "Number of SIFT Keypoints: " + siftImageKeypoints.size() << std::endl;。解决方法是将加号(+)替换为双小于号(<<)。 - Alexander Pacha
5个回答

25

在Windows中,程序通常会被构建为SUBSYSTEM:WINDOWS应用程序或SUBSYSTEM:CONSOLE应用程序

使用SUBSYSTEM:CONSOLE构建的程序通常是文本模式应用程序。对于这种类型的应用程序,stdout和stderr将输出到启动它们的控制台上,必要时会创建一个新的控制台。

相比之下,SUBSYSTEM:WINDOWS应用程序不需要控制台。你仍然可以写入stdout和stderr,但它们通常不会显示任何内容。你可以使用AllocConsole创建一个控制台来打印输出,但这总是会打印到一个新创建的控制台窗口,而不是你从中启动程序的控制台窗口。

SUBSYSTEM:WINDOWS应用程序的一个技巧是,即使没有控制台,你仍然可以管道化stdout和stderr。要管道化stdout,可以执行以下操作:

YourApplication.exe > output.txt

或者如果您有(或类似的东西):

YourApplication.exe | cat

请注意,SUBSYSTEM:WINDOWS应用程序和SUBSYSTEM:CONSOLE应用程序实际上没有任何区别,除了在创建进程时Windows如何处理它们。 (您可以在SUBSYSTEM:CONSOLE应用程序中创建窗口。)因此,您可以轻松地在SUBSYSTEM类型之间切换(例如,在调试构建中使用SUBSYSTEM:CONSOLE,在发布构建中使用SUBSYSTEM:WINDOWS)。


要同时获取stderr:YourApplication.exe 2>&1 | cat - JDiMatteo

18

好的,找到答案了。当遇到这样的问题时,简单的答案当然就像往常一样。迈克尔·艾伦(Michael Aaron)找对了方向。

只需在项目配置中将Subsystem更改为Console(/Configuration properties/Linker/System),整个东西就可以工作了。GUI仍然有效,但是有一个后台控制台。我可以处理它。


这还有些问题,因为我可以很容易地看到 cout,而我通常无法在使用 Cygwin 的 shell 启动程序时看到它。这可能是因为大多数 WinAPI 程序使用 WriteConsole 来输出数据,而不是使用 coutstdout - Euri Pinhollow

9

在你的.pro文件中添加CONFIG += console。


如果您对此回复感到满意并认为它解决了您的问题(显然是这样),请不要忘记将其标记为答案。 - rbaleksandar

4

Windows区分控制台应用程序和图形用户界面(GUI)应用程序,并默认情况下不为GUI应用程序创建控制台(请参阅MSDN上的此页面)。您可以使用AllocConsole创建一个控制台。


@Benoit,它的启动位置并不重要... 它完全取决于应用程序本身(它是否使用与Windows GUI相关的WinMain或其他函数)。 - Michael Aaron Safyan
不仅需要创建控制台,还需要打开标准文件句柄以进行输入、输出和错误处理。 - sbk
@MichaelAaronSafyan 启动程序的位置确实很重要。如果我使用cygwin的shell启动程序,我通常无法看到 cout 的输出,但我可以轻松地在CMD中看到它。 - Euri Pinhollow

0
也许不是 std::cout 这一行导致它没有显示,而是包含它的函数。也许根本没有调用该函数,这就是为什么 std::cout 不起作用的原因。

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