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;

你知道为什么什么都没有显示吗?

4

5 回答 5

22

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

使用 SUBSYSTEM:CONSOLE 构建的程序应该是文本模式应用程序。对于这种类型的应用程序,stdout 和 stderr 打印到您启动它们的控制台,如有必要,创建一个新控制台。

相反,SUBSYSTEM:WINDOWS 应用程序不需要控制台。您仍然可以写入 stdout 和 stderr,但它们通常不会去任何地方。您可以使用AllocConsole创建要打印到的控制台,但这将始终打印到新创建的控制台窗口,而不是您启动程序的控制台窗口。

SUBSYSTEM:WINDOWS 应用程序的一个技巧是,即使没有控制台,您仍然可以通过管道传输 stdout 和 stderr。要管道标准输出,您可以执行以下操作:

YourApplication.exe > output.txt

或者,如果您有cat(或等价物):

YourApplication.exe | cat

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

于 2010-04-13T08:27:29.217 回答
18

好的,找到答案了。简单的回答,当然,在遇到此类问题时一如既往。迈克尔·亚伦走在正确的轨道上。

只需在项目配置(/配置属性/链接器/系统)中将子系统更改为控制台即可使整个工作正常进行。GUI 仍然可以工作,但有一个后台控制台。我可以处理。

于 2010-04-13T08:17:52.740 回答
9

尝试

配置 += 控制台

在您的 .pro 文件中。

于 2010-04-13T23:08:16.993 回答
4

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

于 2010-04-13T08:12:13.553 回答
0

也许不是 std::cout 行使它不显示,而是包含它的函数。也许它根本没有被调用,这就是 std::cout 不起作用的原因。

于 2010-04-13T08:21:14.537 回答