我有一个我在windows上编译的.exe文件。但是当我从命令行运行它时,我没有看到我的程序输出到std :: cout或std :: cerr的任何东西。即使在命令行返回到提示符后,程序也会运行并继续运行(它是一个GUI程序,在我按下退出按钮之前不会退出)。如何查看程序的输出?
我正在使用cmake创建一个visual studio项目,然后我用msbuild编译。
答案 0 :(得分:5)
最简单的方法是将程序重建为控制台应用程序。 link.exe
的选项必须为/SUBSYSTEM:CONSOLE
,而不是/SUBSYSTEM:WINDOWS
;据推测,有一种直接的方法可以在cmake中指定它。
此更改根本不会影响您的GUI,但如果该进程尚未与之关联,则会导致Windows分配控制台。此外,命令行shell通常会在继续之前等待控制台应用程序退出。
另一种方法是调用AllocConsole
以显式创建新控制台,或AttachConsole
如果要使用现有控制台。或者,当然,您可以将输出发送到日志文件。
其他
根据Google搜索,您可以通过在源代码中添加以下行来将程序构建为控制台应用程序:
#pragma comment(linker, "/SUBSYSTEM:CONSOLE")
这可能是最简单的解决方案。如果您只想要用于调试版本的控制台,可以将它放在#if
块中。
另见CMake: How to use different ADD_EXECUTABLE for debug build?
答案 1 :(得分:5)
Harry Johnston's answer是正常的。我建议使用后一种方法,因为将应用程序切换到目标控制台子系统将导致它始终分配并在启动时显示控制台窗口,即使您不希望它。 / p>
但是,我注意到您提到要显示std::cerr
的输出,这意味着您可能只对此信息感兴趣以进行调试。在这种情况下,我的建议是拨打OutputDebugString
function而不是输出到std::cout
或std::cerr
。然后,您可以使用像DebugView这样的小实用程序来监视应用程序的调试输出。它发送到OutputDebugString
函数的所有内容都将显示在DebugView窗口中。
如果您希望在对现有代码库进行最少更改的情况下使用此设置,您实际上可以将std::cout
和std::cerr
等流的输出重定向到调试器,就像您调用了OutputDebugString
函数。有关如何执行此操作的建议,请参阅this question和this blog post的答案。
答案 2 :(得分:2)
查看输出的一种方法是运行:
program.exe > output.txt
然后监视该文件以获取输出。或使用管道查看它:
program.exe | find /v ""
还要监控错误输出,您可以使用
program.exe > output.txt 2>&1
program.exe 2>&1 | find /v ""
我根据Microsoft的文档找出了它,这给想象力和想象力留下了很多 更实际的例子here和here。
这有助于我看到来自我(和其他人)Windows应用程序的“隐藏”stdout和stderr消息。有趣的是看到某些节目中留下了什么消息,但通常都看不到。
答案 3 :(得分:1)
Windows不支持双模式。这意味着当你运行gui时,你无法输出你运行应用程序的控制台。