我有一个在 Windows 上编译的 .exe 文件。但是当我从命令行运行它时,我看不到我的程序输出到 std::cout 或 std::cerr 的任何东西。即使在命令行返回到提示符后,程序也会运行并继续运行(它是一个 GUI 程序,在我按下退出按钮之前不会退出)。如何查看程序的输出?
我正在使用 cmake 制作一个 Visual Studio 项目,然后使用 msbuild 进行编译。
我有一个在 Windows 上编译的 .exe 文件。但是当我从命令行运行它时,我看不到我的程序输出到 std::cout 或 std::cerr 的任何东西。即使在命令行返回到提示符后,程序也会运行并继续运行(它是一个 GUI 程序,在我按下退出按钮之前不会退出)。如何查看程序的输出?
我正在使用 cmake 制作一个 Visual Studio 项目,然后使用 msbuild 进行编译。
最简单的方法是将程序重新构建为控制台应用程序。选项 tolink.exe
需要/SUBSYSTEM:CONSOLE
代替/SUBSYSTEM:WINDOWS
; 大概有一种直接的方法可以在 cmake 中指定它。
此更改根本不应该影响您的 GUI,但如果该进程尚未与一个控制台关联,它将导致 Windows 分配一个控制台。此外,命令行 shell 通常会在继续之前等待控制台应用程序退出。
另一种方法是调用AllocConsole
显式创建新控制台,或者AttachConsole
如果您想使用现有控制台。或者,当然,您可以将输出发送到日志文件。
额外的
根据 Google 搜索,您可以通过在源代码中添加以下行来将该程序构建为控制台应用程序:
#pragma comment(linker, "/SUBSYSTEM:CONSOLE")
这可能是最简单的解决方案。#if
如果您只希望控制台用于调试构建,则可以将其放在一个块中。
如果您想永久更改您的应用程序以显示此信息,Harry Johnston 的回答是正确的。我会推荐他建议的后一种方法,因为将您的应用程序切换到以控制台子系统为目标将导致它始终在启动时分配和显示控制台窗口,即使您不希望它这样做。
但是,我注意到您提到要显示来自 的输出std::cerr
,这意味着您可能仅出于调试目的对该信息感兴趣。在这种情况下,我的建议是调用OutputDebugString
函数而不是输出到std::cout
or 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 ""
我是根据Microsoft的文档和这里和这里的更实际的例子来想出它的。
这有助于我查看来自我(和其他人)Windows 应用程序的“隐藏”标准输出和标准错误消息。有趣的是,在某些程序中留下了哪些消息,但通常看不到。
Windows 不支持双模式。这意味着当您运行 gui 时,您无法将输出输出到您运行应用程序的控制台。