我有我的Windows编译一个.exe文件。 但是,当我在命令行中运行它,我看不到任何的东西我的节目输出到std ::法院或std :: CERR。 该程序运行,并继续运行命令行返回的提示(这是一个GUI程序,不放弃,直到我按下退出键)后还是一样。 我怎么能看到我的程序的输出?
我使用cmake使Visual Studio项目,然后我用的MSBuild编译。
我有我的Windows编译一个.exe文件。 但是,当我在命令行中运行它,我看不到任何的东西我的节目输出到std ::法院或std :: CERR。 该程序运行,并继续运行命令行返回的提示(这是一个GUI程序,不放弃,直到我按下退出键)后还是一样。 我怎么能看到我的程序的输出?
我使用cmake使Visual Studio项目,然后我用的MSBuild编译。
最简单的方法就是重建程序作为控制台应用程序。 至选项link.exe
需要是/SUBSYSTEM:CONSOLE
代替/SUBSYSTEM:WINDOWS
; 想必是在指定的CMake本的简单方法。
这种变化不应该在所有影响你的图形用户界面,但它会导致如果这一进程尚未与一个关联的Windows分配一个控制台。 此外,命令行外壳通常会等待控制台应用程序继续之前退出。
另一种方法是调用AllocConsole
明确创建一个新的控制台,或AttachConsole
如果要使用现有的。 或者,当然,你可以将输出发送到日志文件。
额外
根据谷歌搜索,你可以通过添加下面一行到你的源代码生成程序作为控制台应用程序:
#pragma comment(linker, "/SUBSYSTEM:CONSOLE")
这可能是最简单的解决方案。 你可以把它放在一个#if
块,如果你只希望控制台的调试版本。
另见CMake的:如何使用调试版本不同ADD_EXECUTABLE?
哈里·约翰斯顿的答案通过点上,如果你想永久地改变你的应用程序来显示此信息。 我会建议后者的做法,他指出,因为您的应用程序切换到目标控制台子系统将导致其总是分配和在启动时显示控制台窗口,即使你不希望它。
然而,我注意到你提到你希望显示输出std::cerr
,这意味着你可能只有在这个信息用于调试目的感兴趣。 在这种情况下,我的建议是要调用OutputDebugString
函数 ,而不是输出到任何std::cout
或std::cerr
。 然后,你可以使用一个小工具喜欢的DebugView监视应用程序的调试输出。 将其发送到一切OutputDebugString
功能将被显示在DebugView中的窗口。
如果要使用此设置以最小的改动现有的代码库,你其实可以像重定向数据流的输出std::cout
和std::cerr
到调试器,就如同你调用OutputDebugString
功能。 如何做到这一点的建议可以在答案中发现了这个问题 ,并在此博客文章 。
看到输出的一个方法是运行:
program.exe > output.txt
然后监视输出该文件。 或使用管道进行查看:
program.exe | find /v ""
为了还监控错误输出,你可以使用
program.exe > output.txt 2>&1
program.exe 2>&1 | find /v ""
我想通了基于通过对文档的微软留下了很多的想象,并从更实际的例子在这里和这里 。
这有助于我看到我(和其他人)的Windows应用程序“隐藏”输出和错误消息。 有趣的是看到消息已经被留在一些节目内容,但通常不可见。
Windows不支持双模式。 这意味着当你运行的GUI,你不能输出到您的控制台,您从应用程序。