VSCode下CMake自定义目标无法通过CTRL+C终止进程的问题咨询
问题
我有一个CMake自定义目标,用于运行一个需要通过CTRL+C停止的命令行工具。在终端直接运行该工具时,CTRL+C可以正常终止它,但构建这个CMake自定义目标时,却无法终止该工具。我尝试给CMake目标添加了USES_TERMINAL选项,但没有任何改变。请问是否有我遗漏的CMake或VSCode选项,可以向CMake命令发送SIGINT信号?
复现项目
CMakeLists.txt
cmake_minimum_required(VERSION 3.2.0) project(test_prj LANGUAGES CXX C) set(CMAKE_VERBOSE_MAKEFILE ON CACHE BOOL "ON") add_executable(test_prj main.c) add_custom_target(test_run COMMAND test_prj USES_TERMINAL)
main.c
#include <signal.h> #include <stdio.h> char flag = 1; void sig_handler(int signum) { flag = 0; } int main(void) { signal(SIGINT, sig_handler); while(flag); printf("success\n"); return 0; }
现象对比
- 终端直接运行:
PS C:\22_Test\build> ./test_prj.exe <我在此处按下CTRL-C> success
- 构建CMake自定义目标时:
[main] Building folder: 22_Test test_run [build] Starting build [proc] Executing command: C:\tools\cmake\3.20.2\bin\cmake.EXE --build c:/22_Test/build --config Debug --target test_run -- [build] [1/3 33% :: 0.108] Building C object CMakeFiles/test_prj.dir/main.c.obj [build] [2/3 66% :: 0.345] Linking C executable test_prj.exe [build] [3/3 66% :: 0.345] cmd.exe /C "cd /D C:\22_Test\build && C:\22_Test\build\test_prj.exe" <我在此处按下CTRL-C,但没有任何反应>
解决方案
这个问题源于Windows平台的信号传递特性:当通过cmake --build启动子进程时,CTRL+C触发的SIGINT信号仅发送给顶层CMake进程,不会传递给由cmd.exe /C包裹启动的目标程序。以下是几种可行的解决方法:
1. 绕开cmd.exe直接启动程序
修改CMake自定义目标的命令,避免通过cmd.exe间接调用程序。可以用PowerShell直接执行:
add_custom_target(test_run COMMAND powershell.exe -Command "$<TARGET_FILE:test_prj>" USES_TERMINAL )
或者直接指定可执行文件路径,让CMake跳过shell包裹:
add_custom_target(test_run COMMAND $<TARGET_FILE:test_prj> USES_TERMINAL COMMAND_EXPAND_LISTS )
2. 升级CMake版本
CMake 3.25及以上版本对Windows下的USES_TERMINAL选项做了优化,改善了信号传递逻辑。升级到最新稳定版后,原有的USES_TERMINAL配置可能就能正常传递SIGINT信号。
3. 调整VSCode的终端配置
在VSCode的.vscode/settings.json中,将默认终端设置为PowerShell或Windows Terminal,这两款终端对信号传递的支持比cmd.exe更好:
{ "terminal.integrated.defaultProfile.windows": "PowerShell", "cmake.buildDirectory": "${workspaceFolder}/build" }
4. 直接在终端执行构建命令
编译完成后,直接在终端窗口中运行:
cmake --build ./build --config Debug --target test_run
此时按下CTRL+C,信号会正确传递给目标程序。
内容的提问来源于stack exchange,提问作者Dmitry Grigoryev
相关产品推荐
相关产品推荐

