请参阅.exe的std :: cout

Kur*_*aum 5 windows msbuild command-line exe cmake

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

我正在使用cmake创建一个visual studio项目,然后我用msbuild编译.

pol*_*guy 8

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

program.exe > output.txt 
Run Code Online (Sandbox Code Playgroud)

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

program.exe | find /v ""
Run Code Online (Sandbox Code Playgroud)

要还监视错误输出,您可以使用

program.exe > output.txt 2>&1

program.exe 2>&1 | find /v ""
Run Code Online (Sandbox Code Playgroud)

我根据Microsoft的文档以及这里和这里的更多实际示例得出了这个结论,该文档留下了很多想象空间。

这可以帮助我查看来自我(和其他人)的 Windows 应用程序的“隐藏”stdout 和 stderr 消息。看看某些程序中留下了哪些通常看不到的消息是很有趣的。


Har*_*ton 5

最简单的方法是将程序重建为控制台应用程序.link.exe需要的选择/SUBSYSTEM:CONSOLE代替/SUBSYSTEM:WINDOWS; 据推测,有一种直接的方法可以在cmake中指定它.

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

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

额外

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

#pragma comment(linker, "/SUBSYSTEM:CONSOLE")
Run Code Online (Sandbox Code Playgroud)

这可能是最简单的解决方案.#if如果您只想要用于调试版本的控制台,可以将它放在一个块中.

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


Cod*_*ray 5

如果您想永久改变您的应用程序以显示此信息,那么Harry Johnston的回答是正确的.我建议使用后一种方法,因为将应用程序切换到目标控制台子系统将导致它始终在启动时分配和显示控制台窗口,即使您不希望它也是如此.

但是,我注意到您提到要显示输出std::cerr,这意味着您可能只对此信息感兴趣以进行调试.在这种情况下,我的建议是调用OutputDebugString函数而不是输出到std::cout或std::cerr.然后,您可以使用DebugView之类的小实用程序来监视应用程序的调试输出.它发送给OutputDebugString函数的所有内容都将显示在DebugView窗口中.

如果要使用此设置以最小的改动现有的代码库,你其实可以像重定向数据流的输出std::cout,并std::cerr到调试器,就如同你调用OutputDebugString函数.有关如何执行此操作的建议可以在此问题的答案和本博文中找到.