防止控制台窗口在 Visual Studio 2017 cmake 项目中关闭

Posted

技术标签:

【中文标题】防止控制台窗口在 Visual Studio 2017 cmake 项目中关闭【英文标题】:Prevent console window from closing in Visual Studio 2017 cmake project 【发布时间】:2017-07-26 04:55:22 【问题描述】:

Visual Studio 2017 内置了对 cmake 项目的支持,这意味着您只需打开一个包含 CMakeLists.txt 的文件夹并使用它。但是,似乎没有办法prevent the console window from closing after running an executable。

对于普通的 Visual Studio 项目,您可以使用 Ctrl+F5 来运行,而无需附加调试器。但是,Ctrl+F5 的作用与 F5 完全相同,即运行可执行文件并立即关闭控制台窗口。

另一个建议是将子系统设置为应用程序的“控制台”,但 cmake 项目没有我可以为其设置设置的 Visual Studio 项目。

我想也许我可以为我的 CMakeLists.txt(右键单击 > 调试和启动设置 > target.exe)转到 调试和启动设置,它打开了launch.vs.json。不幸的是,我无法找到这方面的文档。不过,通过查看架构,似乎我可以设置"noDebug": true,但这只是关闭了调试器,并没有阻止控制台关闭:


  "version": "0.2.1",
  "defaults": ,
  "configurations": [
    
      "type": "default",
      "project": "CMakeLists.txt",
      "projectTarget": "target.exe",
      "name": "target.exe",
      "noDebug": true
    
  ]

这让我发疯了。我不能只在主函数中添加system("pause"),因为我使用的是测试框架提供的主函数。此外,这完全没有必要; Visual Studio 应该为我处理它。

当我的可执行文件来自 cmake 项目时,如何让 Visual Studio 控制台在我的可执行文件完成后不关闭?

我正在使用 Microsoft Visual Studio Community 2017,版本 15.2 (26430.16) 发布

【问题讨论】:

launch.vs.json 有一个"stopOnEntry": true,它在main() 的入口处中断。太糟糕了,它没有类似"stopOnExit"... 如何构建项目,然后直接从控制台启动构建的可执行文件? @Scheff 这是可以做到的,就像在 main 函数的末尾设置断点一样。但是,这并不能解决这个问题; Visual Studio 为普通项目内置了它。我想要这种行为。 这引起了我的注意,因为您准确地描述了我们通常在 VS2013 中的工作方式(没有问题)。主要区别在于 VS2013 没有内置对 CMake 的支持(除了我们自己的自制软件)。因此,我们总是生成项目和解决方案文件。可以轻松更改项目/解决方案的属性(直到下一次 CMake 运行将覆盖它)。 CMake/VS2017 是否有此选项(即忽略内置支持)? (我试图用谷歌搜索,但只发现 CMake 现在已集成到 VS2017 中的“一千个”链接......) @FlorianWolters 我从来没有真正解决过这个问题;我最终离开了 VS 并使用命令行调用 cmake。 【参考方案1】:

这是 Visual Studio 2017 CMake 支持中的 bug。在 VS 2019 中已解决。

作为临时解决方法,在应用程序退出时添加断点并在 (F5) 上调试运行:

    Ctrl+B新断点) 输入函数名:exit 按确定

现在,如果您运行项目 (F5),调试器将在 main() 返回后停止。

要删除断点,请转到断点视图 (Ctrl+Alt+B) 并删除从那里开始。

【讨论】:

这个解决方法对我有用 - 如果这是公认的答案,@rustyx 可能会很感激。【参考方案2】:

最近遇到这种情况,因为我们有时在 UI 应用程序中使用 stdout 来调试信息,我们需要在我们的开发机器上打开控制台窗口,但在我们的 CI 构建中将其关闭。

在你的 CMakeLists.txt 中必须有一个 'add_executable' 语句,像这样:

add_executable(project_name WIN32 $your_source_files)

如果您省略 WIN32,CMake 会将子系统更改为“控制台”,这会导致 Visual Studio 在您的应用程序退出时保持控制台窗口打开。

【讨论】:

你是说我的 CMakeLists.txt 现在有add_executable(project_name WIN32 ...),还是我应该添加WIN32 是的,add_executable 语句声明了一个创建可执行文件的 CMake-Targets。如果 WIN32 存在,它将是 Subsystem:Windows,如果您删除它,它将是 Subsystem:Console。所以,我告诉你删除它。 我没有将WIN32 传递给add_executable 命令,只是传递了可执行文件的名称和cpp 文件。 好的,但它应该被视为控制台应用程序。如果使用 CMake 生成 VS-Solution 并在 Visual Studio 中打开会发生什么情况,应用程序是否有子系统 Console?

以上是关于防止控制台窗口在 Visual Studio 2017 cmake 项目中关闭的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio C# 中控制外部窗口

如何在 Visual Studio C++ 中使用代码关闭控制台窗口

防止 Visual Studio 调试因明显的“未处理异常”而中断

在Visual Studio中编码c ++时消失的控制台窗口

调试时 Visual Studio 2019 未启动控制台应用程序窗口

visual studio 2010在运行调试时,运行窗口自动退出