Windows 请参阅std::cout of.exe

Windows 请参阅std::cout of.exe,windows,command-line,msbuild,cmake,exe,Windows,Command Line,Msbuild,Cmake,Exe,我有一个在windows上编译的.exe文件。但是当我从命令行运行它时,我看不到程序输出到std::cout或std::cerr的任何内容。即使在命令行返回提示符后,程序仍会运行并继续运行(这是一个GUI程序,在我按下退出按钮之前不会退出)。如何查看程序的输出 我正在使用cmake创建一个visual studio项目,然后使用msbuild编译该项目。Windows不支持双模式。这意味着,当您运行gui时,您无法从运行应用程序的控制台获得输出 最简单的方法是将程序重建为控制台应用程序。link

我有一个在windows上编译的.exe文件。但是当我从命令行运行它时,我看不到程序输出到std::cout或std::cerr的任何内容。即使在命令行返回提示符后,程序仍会运行并继续运行(这是一个GUI程序,在我按下退出按钮之前不会退出)。如何查看程序的输出


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

Windows不支持双模式。这意味着,当您运行gui时,您无法从运行应用程序的控制台获得输出

最简单的方法是将程序重建为控制台应用程序。
link.exe
的选项必须是
/SUBSYSTEM:CONSOLE
,而不是
/SUBSYSTEM:WINDOWS
;大概有一种简单的方法可以在cmake中指定这一点

此更改不应影响GUI,但如果进程尚未与控制台关联,则会导致Windows分配控制台。此外,命令行shell通常会等待控制台应用程序退出,然后再继续

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

附加的

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

#pragma comment(linker, "/SUBSYSTEM:CONSOLE")
这可能是最简单的解决方案。如果只需要调试生成的控制台,可以将其放入
#if
块中

如果要永久更改应用程序以显示此信息,请参见。我建议采用他建议的后一种方法,因为将应用程序切换到目标控制台子系统将导致它在启动时始终分配并显示控制台窗口,即使您不希望它这样做

但是,我注意到您提到要显示来自
std::cerr
的输出,这意味着您可能只出于调试目的对这些信息感兴趣。在这种情况下,我的建议是调用而不是输出到
std::cout
std::cerr
。然后,您可以使用一个类似的小实用程序来监视应用程序的调试输出。它发送到
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应用程序的“隐藏”标准输出和标准输出消息。查看某些程序中留下了哪些消息是很有趣的,但通常是看不到的。

实际上,没有什么可以阻止控制台应用程序显示GUI,GUI应用程序也可以将输出发送到启动它的控制台-但它必须有意识地这样做,这不是“偶然发生的”@Harry我想你会给提问者提供一个解决方案,这样我也可以学习。我在哪里可以指定/SUBSYSTEM:CONSOLE选项?这在我的.sln文件中吗?此后我几乎完全改用linux。但是,我想补充一点,pycharm不是一个现成的gui程序,如果在终端/命令提示符下运行,它会输出大量的输出,如果您只需单击它,它是看不到的。