cmake 内部模块总结(工作中的总结持续更新中)
1.Windows 环境 VSCode C/C++ 搭建
*在Windwos下C/C++的编程环境搭建主要有5种,我将详细的分章节进行描述:
MSVC(VS2022 工具链)
编译器/链接器:cl/link,调试器:cppvsdbg(原生 Windows)
适配:Windows 原生、IDE 生态强、PDB 符号、性能好
构建:MSBuild 或 CMake(生成器“Visual Studio 17 2022”或“Ninja”)
MinGW-w64(MSYS2)
编译器:gcc/g++,调试器:gdb
适配:GNU 工具链、跨平台代码友好、轻量;与 MSVC 二进制/调试器不通用
构建:Makefiles/Ninja/CMake(生成器“MinGW Makefiles”或“Ninja”)
LLVM/Clang(Windows)
编译器:clang/clang++,调试器:lldb 或 gdb
适配:跨平台一致性、静态分析好;Windows 下调试器组合需留意(vsdbg/gdb/lldb)
构建:CMake + Ninja 最常见
WSL(Linux 子系统)
编译器:gcc/clang(Linux),调试器:gdb/lldb
适配:在 Windows 上开发但用 Linux 环境构建/调试;与容器/云一致性好
构建:Linux 下 CMake + Ninja/Make
Cygwin(次选)
编译器:GNU 工具链,类 POSIX 环境
适配:在 Windows 提供 POSIX 层;对原生 Win API/调试支持不如 MSVC/MinGW
构建:Make/CMake,使用较少
1.2.VSCode 必备扩展
C/C++(ms-vscode.cpptools):IntelliSense、调试适配器(cppdbg/cppvsdbg)
CMake Tools(ms-vscode.cmake-tools):CMake 配置/构建/调试集成、自动目标发现
WSL、Remote-SSH(可选):远程/WSL 开发
CodeLLDB(可选):使用 lldb 时
1.3 配置文件与生成
tasks.json :定义构建任务(编译/运行脚本)。可通过“Terminal → Configure Tasks”生成;CMake 场景可省略,直接用 CMake Tools 的命令或用它生成任务。
launch.json :调试配置。通过“Run → Add Configuration…”生成。CMake Tools 可自动提供调试目标,很多时候可不手写或仅少量自定义。
c_cpp_properties.json :C/C++ 扩展的 IntelliSense 配置(includePath、compilerPath 等)。在 CMake 项目中,推荐改用 CMake Tools 作为配置提供者或启用 compile_commands.json,从而不手动维护该文件。
CMake 项目替代:开启 CMAKE_EXPORT_COMPILE_COMMANDS=ON 后,C/C++ 扩展可基于 compile_commands.json 自动解析头文件、宏与标准。
1.3.1 task.json 文件介绍:
1.3.1.1 文件作用
目的: 在 VS Code 里定义可执行的“任务”(编译、运行脚本、工具链命令等),供“运行任务”或调试前置任务调用。
位置: .vscod\tasks.json(工作区级别)。
这里需要有一个顶层视角去看:顶层只能有一个task,我称之为顶层任务,在这个任务中有许多子任务,这些子任务是按照顶层任务安排的顺序执行的。
tasks": [
{子任务1},
{子任务2},
...
{子任务n}
]
1.3.1.2 关键字段
version: 任务配置的版本。常用 2.0.0。
tasks: 任务列表,每个对象是一条任务
type: 任务类型
类型概念
用途: type 指定任务如何执行命令(由谁提供、如何启动)。不同 type 由 VS Code 核心或已安装扩展提供。
位置: tasks.json 的每个任务对象里
内置类型(核心)
shell: 通过操作系统的 Shell 执行命令,支持管道/重定向、复合命令。
process: 直接启动一个可执行文件为子进程(不经过 Shell)。
扩展贡献类型(因扩展而异)
取决于你安装的扩展,没有固定上限。常见示例:
cppbuild(C/C++ 扩展提供的自动编译任务模板)
npm(JavaScript/Node 场景)
tsc(TypeScript 编译器任务)
msbuild、dotnet(C#/.NET 扩展)
gradle、maven(Java 扩展)
gulp、grunt、make(相应生态的扩展)
说明:这些类型仅在安装了对应扩展后可用,名称也由扩展定义。
组合任务(不写 type)
可以创建“仅依赖其他任务”的组合任务,它通常没有 command 和 type,只用 dependsOn 把若干任务串联起来,并用 dependsOrder 控制顺序或并行。
}
label: 任务显示名,供 UI 选择与 preLaunchTask 引用。
command: 要执行的命令或可执行路径(如 g++.exe、cl)。
args: 命令参数数组,支持 VS Code 变量(如 ${file}、${workspaceFolder})。
command + arg的组合,一般都是这样使用的,command arg1 arg2 ...
常用写法示例
1)简单 shell 命令(清理文件)
{
"label": "clean",
"type": "shell",
"command": "rm",
"args": ["-f", "${workspaceFolder}/helloworld.exe"]
}
2)调用脚本/程序
{
"label": "run python script",
"type": "shell",
"command": "python",
"args": ["${workspaceFolder}/script.py"]
}
3)编译 C++
{
"label": "build c++",
"type": "shell",
"command": "g++",
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "${fileDirname}"
}
}
进一步扩展可以针对不同平台指定不同的 command/args:
{
"label": "build",
"type": "shell",
"command": "g++",
"windows": {
"command": "C:\mingw64\bin\g++.exe"
},
"linux": {
"command": "g++"
},
"args": ["main.cpp", "-o", "main"]
}
options: 任务执行的选项。
1.概念:
用来控制“任务进程/命令”的运行环境(工作目录、环境变量、使用哪个 shell 等)。它不改变任务做什么,只影响“怎么执行”。
2.适应范围:
任务类型为 shell 或 process 都可使用 options。
对 shell 任务,options.shell 生效;对 process 任务,options.shell 会被忽略(只用 cwd/env)。
3.可用子项与含义
3.1. cwd: 任务的工作目录(如 ${fileDirname})。
示例
{
"version": "2.0.0",
"tasks": [
{
"label": "web: build",
"type": "shell",
"command": "npm run build",
"options": {
"cwd": "${workspaceFolder}/packages/web"
}
}
]
}
3.2. env: 增补或覆盖环境变量(如 { "PATH": "..." })
示例
{
"version": "2.0.0",
"tasks": [
{
"label": "api: start (prod)",
"type": "shell",
"command": "node dist/server.js",
"options": {
"cwd": "${workspaceFolder}/packages/api",
"env": {
"NODE_ENV": "production",
"PORT": "8080"
}
}
}
]
}
3.3. shell: 指定 shell 行为(如 { "executable": "bash" })
示例
{
"version": "2.0.0",
"tasks": [
{
"label": "python: run with env",
"type": "shell",
"command": "python -m myapp",
"options": {
"env": {
"PYTHONUTF8": "1",
"LOG_LEVEL": "debug"
}
}
}
]
}
3.4. 指定输入编码(少见,但遇到中文乱码时很有用)options.shell
示例:
{
"version": "2.0.0",
"tasks": [
{
"label": "cmd utf8 then run",
"type": "shell",
"command": "chcp 65001>nul && node script.js",
"options": {
"shell": {
"executable": "cmd.exe",
"args": ["/d", "/c"]
}
}
}
]
}
3.5 配合 dependsOn:不同任务用不同 cwd/env
示例
{
"version": "2.0.0",
"tasks": [
{
"label": "gen",
"type": "shell",
"command": "npm run gen",
"options": { "cwd": "${workspaceFolder}/packages/api" }
},
{
"label": "start",
"type": "shell",
"command": "npm run start",
"dependsOn": ["gen"],
"options": {
"cwd": "${workspaceFolder}/packages/api",
"env": { "NODE_ENV": "development" }
}
}
]
}
problemMatcher: 错误/警告匹配器,解析编译输出并在“问题”面板标注位置。
常用内置: $gcc(GNU/Clang)、$msCompile(MSVC)、$eslint-stylish 等。
可自定义正则以解析自定义工具输出。
group: 将任务归类。
kind: build、test、none。
isDefault: 是否为该类的默认任务(如默认“构建”)。
detail: 任务说明文字,显示在 UI 中(例如“Task generated by Debugger.”)。
presentation: 控制任务终端外观与行为。
reveal: always | never | silent(是否自动切到任务终端)。
panel: shared | dedicated | new(是否复用终端面板)。
clear: true/false(开跑前是否清屏)。
runOptions:
runOn: folderOpen(打开工作区时自动运行任务)。
isBackground: true/false(任务是否为后台任务,如 watch 构建)。
dependsOn: 任务依赖(可串联多个任务如先清理再编译)。
dependsOrder: sequence | parallel(依赖任务顺序或并行)。
windows/osx/linux: 平台特定覆盖(不同系统走不同命令/参数)。
inputs: 交互输入(参数化任务,如让用户选择选项/输入字符串)。
1.3.1.3 内置变量(常用)
1.3.1.3.1 文件/路径:
${workspaceFolder} : 工作区根目录
${file} :活动编辑器文件的绝对路径
${fileDirname} :活动文件的文件名(含扩展名)
${fileBasename} :活动文件名(不含扩展名)
${fileBasenameNoExtension} :相对于工作区根的活动文件路径
$
1.3.1.3.2 选择/活动:
${selectedText},
${lineNumber}
1.3.1.3.3 配置/环境:
${config:foo.bar},
${env:NAME}
1.3.1.3.3时间/随机(较少用):
${currentDate},
${random}
1.3.1.4 多动作实例
{
"version": "2.0.0",
"tasks": [
{
"label": "clean",
"type": "shell",
"command": "powershell",
"args": [
"-NoProfile",
"-Command",
"Remove-Item -Force ${workspaceFolder}\helloworld.exe -ErrorAction SilentlyContinue"
],
"problemMatcher": [],
"presentation": {
"reveal": "always",
"panel": "shared",
"clear": true
}
},
{
"type": "cppbuild",
"label": "build (g++)",
"command": "C:\mingw64\bin\g++.exe",
"args": [
"-fdiagnostics-color=always",
"-g",
"${workspaceFolder}\helloworld.cpp",
"-o",
"${workspaceFolder}\helloworld.exe"
],
"options": { "cwd": "${workspaceFolder}" },
"problemMatcher": ["$gcc"],
"group": { "kind": "build", "isDefault": true },
"detail": "Build with MinGW g++"
},
{
"label": "run",
"type": "shell",
"command": "${workspaceFolder}\helloworld.exe",
"options": { "cwd": "${workspaceFolder}" },
"problemMatcher": []
},
{
"label": "clean -> build -> run",
"dependsOn": ["clean", "build (g++)", "run"],
"dependsOrder": "sequence",
"problemMatcher": []
}
]
}
1.3.2 lauch.json 文件介绍
1.3.2.1 lauch.json的作用
launch.json 定义 调试配置(Debug Configurations),用于:
- 启动(launch)一个可执行程序并调试
- 或附加(attach)到已运行进程调试
- 支持断点、变量查看、调用栈、内存、反汇编、寄存器、多线程等
1.3.2.2 launch.json 的“最常用字段”速查(C/C++重点)
1.3.2.3 C/C++典型场景与用例
1.3.2.4 实战建议(C/C++最容易踩坑的点)
- 断点不生效:90% 是没带调试信息或优化太高
- gcc/clang:Debug 构建加 -g,避免 -O2/-O3(或用 -Og)
- program 路径不对:CMake 多配置(Debug/Release)在不同目录;Windows 路径用 \
- 需要 stdin:用 integratedTerminal
- 启动前必须先编译:用 preLaunchTask 绑定到你的 build task
- 远程/容器:优先想到 sourceFileMap(不然断点会飘)
1.4 调试模板选择
MSVC:用 cppvsdbg(“c/c++ (windows) launch/attach”),适合 VS2022/cl 构建的 EXE。
MinGW/WSL/远程:用 cppdbg + MIMode: gdb(“c/c++ (gdb) launch/attach”)。WSL/远程通过 pipeTransport 或 Bash on Windows 模板。
Clang+LLDB:用 CodeLLDB 扩展(type: lldb)或 cppdbg+gdb 组合。

浙公网安备 33010602011771号