参见.exe的std :: cout

我有一个.exe文件,我在Windows上编译。 但是当我从命令行运行它,我没有看到我的程序输出到std :: cout或std :: cerr的任何东西。 即使在命令行返回提示(这是一个GUI程序,直到按下退出button后才退出),程序仍然运行并继续运行。 我怎样才能看到我的程序的输出?

我使用cmake来制作一个visual studio项目,然后用msbuild编译。

Solutions Collecting From Web of "参见.exe的std :: cout"

最简单的方法是重建程序作为控制台应用程序。 link.exe的选项需要是/SUBSYSTEM:CONSOLE而不是/SUBSYSTEM:WINDOWS ; 大概有一个简单的方法来指定这个cmake。

此更改不应该影响您的GUI,但它会导致Windows分配一个控制台,如果进程尚未与一个关联。 而且,命令行shell通常会在继续之前等待控制台应用程序退出。

另一种方法是调用AllocConsole显式创建一个新的控制台,或者如果您想使用现有的控制台,可以使用AttachConsole 。 或者,当然,您可以将输出发送到日志文件。

额外

根据Google搜索,您可以通过将以下行添加到您的源代码中,将该程序构建为控制台应用程序:

 #pragma comment(linker, "/SUBSYSTEM:CONSOLE") 

这可能是最简单的解决方案。 你可以把它放在#if块中,如果你只想调试版本的控制台。

另请参见CMake:如何使用不同的ADD_EXECUTABLE进行调试构建?

如果你想永久地改变你的应用程序来显示这个信息, Harry Johnston的答案就是现成的 。 我会推荐他建议的后一种方法,因为将应用程序切换为定位控制台子系统将使其始终在启动时分配和显示控制台窗口,即使您不希望它。

不过,我注意到你提到你要显示来自std::cerr输出,这意味着你可能只是为了调试目的而对这个信息感兴趣。 在这种情况下,我的建议是调用OutputDebugString函数,而不是输出到std::coutstd::cerr 。 然后,可以使用一个像DebugView这样的小工具来监视应用程序的调试输出。 它发送到OutputDebugString函数的所有内容都将显示在DebugView窗口中。

如果你想使用这个设置,只需对现有代码库进行最小的修改,就可以实际上将std::coutstd::cerr类的输出重定向到调试器,就像调用OutputDebugString函数一样。 关于如何做到这一点的建议可以在这个问题的答案和这篇博客文章中找到 。

Windows不支持双模式。 这意味着当你运行gui的时候,你不能得到输出到你运行应用程序的控制台。

查看输出的一种方法是运行:

 program.exe > output.txt 

然后监视该文件的输出。 或使用管道来查看它:

 program.exe | find /v "" 

还要监视你可以使用的错误输出

 program.exe > output.txt 2>&1 program.exe 2>&1 | find /v "" 

基于微软的文档,我想到了这一点,这让我们有很多想象力,还有更多的实际例子。

这有助于我看到来自我(和其他人)的Windows应用程序的“隐藏”stdout和stderr消息。 看到在某些程序中留下了什么信息是很有趣的,但通常是看不到的。