【问题标题】:See std::cout of .exe请参阅 .exe 的 std::cout
【发布时间】:2012-05-11 02:04:24
【问题描述】:

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

我正在使用 cmake 制作一个 Visual Studio 项目,然后我使用 msbuild 进行编译。

【问题讨论】:

    标签: windows command-line msbuild cmake exe


    【解决方案1】:

    最简单的方法是将程序重新构建为控制台应用程序。 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?

    【讨论】:

    • 在哪里可以指定 /SUBSYSTEM:CONSOLE 选项?那在我的 .sln 文件中吗?
    【解决方案2】:
    如果您想永久更改您的应用程序以显示此信息,

    Harry Johnston's answer 就在现场。我会推荐他建议的后一种方法,因为将您的应用程序切换到以控制台子系统为目标将导致它始终在启动时分配并显示一个控制台窗口,即使您不希望它这样做。

    但是,我注意到您提到要显示来自 std::cerr 的输出,这意味着您可能仅出于调试目的对这些信息感兴趣。在这种情况下,我的建议是调用OutputDebugString function,而不是输出到std::coutstd::cerr。然后,您可以使用像DebugView 这样的小工具来监控应用程序的调试输出。它发送到OutputDebugString 函数的所有内容都将显示在DebugView 窗口中。

    如果您想在对现有代码库进行最小更改的情况下使用此设置,您实际上可以将std::coutstd::cerr 等流的输出重定向到调试器,就像您调用OutputDebugString 一样功能。可以在this questionthis blog post 的答案中找到有关如何执行此操作的建议。

    【讨论】:

      【解决方案3】:

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

      program.exe > output.txt 
      

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

      program.exe | find /v ""
      

      还可以监控您可以使用的错误输出

      program.exe > output.txt 2>&1
      
      program.exe 2>&1 | find /v ""
      

      我是根据Microsoft 的文档想出来的,这给想象力和 更多实际示例herehere

      这有助于我查看来自我(和其他人)Windows 应用程序的“隐藏”标准输出和标准错误消息。看看一些程序中留下了哪些消息,但通常是看不到的,这很有趣。

      【讨论】:

      • 从那以后我几乎完全转向使用 linux。但是,我想补充一点,并不是说 pycharm 是一个现成的 gui 程序,如果它在终端/命令提示符下运行,它会吐出很多输出,如果你只是单击它就看不到它。跨度>
      【解决方案4】:

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

      【讨论】:

      • 实际上,没有什么可以阻止控制台应用程序呈现 GUI,GUI 应用程序也可以将输出发送到启动它的控制台 - 但它必须故意这样做,它不会“刚刚发生”。
      • @Harry 我想你会给提问者一个解决方案,所以我也可以学习?
      猜你喜欢
      • 2010-10-12
      • 1970-01-01
      • 2011-12-04
      • 2018-07-09
      • 2011-12-14
      • 2023-03-11
      • 1970-01-01
      相关资源
      最近更新 更多