防止控制台窗口在 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 调试因明显的“未处理异常”而中断
在Visual Studio中编码c ++时消失的控制台窗口