You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 12:20:41