下面是一套 VS Code + clangd 的完整 C/C++ 开发配置教程。重点记住一句话:clangd 负责智能补全/跳转/诊断/格式化,不负责真正编译和调试;编译靠 CMake/Make/Ninja,调试靠 GDB/LLDB/Windows Debugger。
1. 先搞清楚 VS Code + clangd 的分工
clangd 是 LLVM/Clang 项目里的 C/C++ 语言服务器,它通过 Language Server Protocol 给编辑器提供补全、诊断、跳转、悬停信息等功能;VS Code 里需要安装 clangd 扩展来连接这个语言服务器。(Clangd)
clangd 常见功能包括:代码补全、编译错误/警告提示、Go to Definition、Find References、Hover、Inlay Hints、include 管理、格式化、部分重构等。VS Code Marketplace 上的 clangd 扩展也明确列出了这些能力。(Visual Studio Marketplace)
你需要准备这几类工具:
| 工具 | 作用 |
|---|---|
| VS Code | 编辑器 |
| clangd | C/C++ 智能提示、跳转、诊断 |
| clang / gcc / MSVC | 真正编译代码 |
| CMake / Make / Ninja | 构建工程 |
| GDB / LLDB / Windows Debugger | 调试程序 |
| clang-format | 代码格式化 |
| clang-tidy | 静态检查;clangd 可以集成部分 clang-tidy 检查 |
clangd 最重要的输入是 编译参数。C/C++ 源文件不是自包含的,clangd 必须知道你的 -I、-D、-std=、目标平台、编译器路径等信息,否则就会出现“代码明明能编译,但 VS Code 里全是红线”的情况。官方文档也强调,clangd 需要知道项目如何构建,通常通过 compile_commands.json 提供这些编译命令。(Clangd)
2. 安装 clangd 和必要工具
Windows
推荐安装:
-
VS Code
-
LLVM 官方安装包,里面包含 clangd.exe、clang.exe、clang++.exe、clang-format.exe、clang-tidy.exe
-
CMake
-
Ninja
-
调试器:MSVC 路线用 Visual Studio Build Tools / Windows Debugger;MinGW 路线用 GDB
clangd 官方文档建议 Windows 用户从 LLVM releases 下载 LLVM installer;安装后确认 clangd 在 PATH 中。(Clangd)
检查命令:
clangd --version clang++ --version cmake --version ninja --version
如果 clangd --version 找不到,把 LLVM 的 bin 目录加入环境变量,例如:
C:\Program Files\LLVM\bin
macOS
用 Homebrew 最省事:
brew install llvm cmake ninja
clangd 官方安装文档也给出了 Homebrew 安装方式。(Clangd)
Apple Silicon 常见路径:
/opt/homebrew/opt/llvm/bin/clangd /opt/homebrew/opt/llvm/bin/clang++
Intel Mac 常见路径:
/usr/local/opt/llvm/bin/clangd /usr/local/opt/llvm/bin/clang++
可以把 LLVM 加入 shell 配置:
echo 'export PATH="/opt/homebrew/opt/llvm/bin:$PATH"' >> ~/.zshrc source ~/.zshrc
检查:
clangd --version clang++ --version cmake --version ninja --version
Ubuntu / Debian
简单路线:
sudo apt update sudo apt install clangd clang-format clang-tidy cmake ninja-build gdb build-essential
如果发行版自带 clangd 版本太旧,可以用 LLVM 官方 apt.llvm.org 源。apt.llvm.org 页面说明它提供 Debian/Ubuntu 的 LLVM/Clang/LLDB/LLD/libc++ 等包,并提供自动安装脚本;页面还列出了 clangd、clang-format、clang-tidy 等默认包。(LLVM Apt Repository)
官方脚本示例:
bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"
然后安装:
sudo apt install clangd clang-format clang-tidy
检查:
clangd --version clang++ --version cmake --version ninja --version gdb --version
3. 安装 VS Code 扩展
在 VS Code 扩展市场搜索并安装:
clangd
发布者是:
LLVM
VS Code 的 clangd 扩展需要本机存在 clangd language server;如果 PATH 里找不到,扩展会提示下载,在 x86-64 Linux、Windows、macOS 上可自动安装。(Visual Studio Marketplace)
建议再安装:
CMake Tools
CMake Tools 不是 clangd 必需品,但它可以在 VS Code 中配置、构建、调试 CMake 工程。VS Code 官方文档说明 CMake Tools 会把 VS Code 和 CMake 集成起来,方便配置、构建、调试 C++ 项目。(Visual Studio Code)
关于 Microsoft C/C++ 扩展:
-
如果你只想用 clangd 做语言服务,最干净的方式是 只装 clangd,不装 Microsoft C/C++。clangd 官方 VS Code 安装说明也建议确保 Microsoft C/C++ 扩展没有安装。(Clangd)
-
如果你需要 Microsoft C/C++ 扩展提供调试能力,可以保留它,但建议不要让它和 clangd 同时做 IntelliSense,否则会出现重复诊断、重复补全、跳转来源混乱等问题。
4. VS Code 基础配置:.vscode/settings.json
在项目根目录新建:
.vscode/settings.json
推荐基础配置:
{
"clangd.arguments": [
"--background-index",
"--clang-tidy"
],
"[c]": {
"editor.defaultFormatter": "llvm-vs-code-extensions.vscode-clangd",
"editor.formatOnSave": true
},
"[cpp]": {
"editor.defaultFormatter": "llvm-vs-code-extensions.vscode-clangd",
"editor.formatOnSave": true
},
"editor.inlayHints.enabled": "on"
}
clangd 的命令行参数可以通过 VS Code 的 clangd.arguments 数组传入;如果你的 clangd 不在 PATH 里,也可以用 clangd.path 指定 clangd 可执行文件路径。官方文档在 VS Code 部分说明了这两个设置。(Clangd)
例如 Windows:
{
"clangd.path": "C:\\Program Files\\LLVM\\bin\\clangd.exe",
"clangd.arguments": [
"--background-index",
"--clang-tidy"
]
}
例如 macOS Homebrew:
{
"clangd.path": "/opt/homebrew/opt/llvm/bin/clangd",
"clangd.arguments": [
"--background-index",
"--clang-tidy"
]
}
5. 最核心:生成 compile_commands.json
clangd 好不好用,80% 取决于 compile_commands.json。
这个文件记录每个源文件的真实编译命令,例如:
[
{
"directory": "/path/to/project/build",
"command": "/usr/bin/clang++ -I../include -std=c++20 -g -c ../src/main.cpp",
"file": "../src/main.cpp"
}
]
CMake 官方文档说明,CMAKE_EXPORT_COMPILE_COMMANDS 会生成 compile_commands.json,其中包含项目所有 translation units 的精确编译器调用;该选项目前主要由 Makefile 和 Ninja generators 实现。(CMake)
6. 推荐工程结构:CMake + Ninja + clangd
新建项目:
hello-clangd/ ├── CMakeLists.txt ├── include/ │ └── hello.hpp ├── src/ │ ├── hello.cpp │ └── main.cpp ├── .vscode/ │ └── settings.json ├── .clangd └── .clang-format
CMakeLists.txt:
cmake_minimum_required(VERSION 3.20)
project(hello_clangd LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
add_executable(hello
src/main.cpp
src/hello.cpp
)
target_include_directories(hello PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/include
)
include/hello.hpp:
#pragma once #include <string> std::string make_message(const std::string& name);
src/hello.cpp:
#include "hello.hpp"
std::string make_message(const std::string& name) {
return "Hello, " + name + "!";
}
src/main.cpp:
#include "hello.hpp"
#include <iostream>
int main() {
std::cout << make_message("clangd") << '\n';
return 0;
}
在项目根目录执行:
cmake -S . -B build -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Debug cmake --build build
如果你的 build 目录就在源码根目录下,clangd 通常能自动找到 build/compile_commands.json。clangd 官方文档说明,它会从正在编辑的文件向父目录搜索 compile_commands.json,也会搜索名为 build/ 的子目录;如果构建目录不在源码树的 $SRC 或 $SRC/build,可以复制或软链接 compile_commands.json 到源码根目录。(Clangd)
Linux/macOS 可以软链接:
ln -sf build/compile_commands.json compile_commands.json
Windows PowerShell 可以复制:
Copy-Item build\compile_commands.json .\compile_commands.json -Force
7. 如果不是 CMake 项目怎么办?
方案 A:Makefile 项目,用 Bear 生成
如果你的项目是 Makefile,可以用 Bear 记录一次完整构建,生成 compile_commands.json。clangd 官方文档给出的方式是:Bear 3.x 用 bear -- make,Bear 2.x 用 bear make。(Clangd)
make clean bear -- make -j
生成后确认项目根目录有:
compile_commands.json
然后重启 clangd:
Ctrl+Shift+P → clangd: Restart language server
方案 B:特别简单的小项目,用 compile_flags.txt
如果所有 .cpp 文件的编译参数基本一样,可以在项目根目录新建:
compile_flags.txt
示例:
-std=c++20 -Iinclude -Wall -Wextra -DDEBUG
clangd 官方文档说明,compile_flags.txt 适合所有文件共用同一套编译参数的简单项目;但如果存在 compile_commands.json,compile_flags.txt 会被忽略,而且 compile_flags.txt 场景下后台索引能力会受限。(Clangd)
8. .clangd:项目级 clangd 配置
在项目根目录新建:
.clangd
推荐模板:
CompileFlags:
Add: [-Wall, -Wextra]
Remove: [-Werror]
Diagnostics:
ClangTidy:
Add: [bugprone-*, performance-*, modernize-*]
Remove: [modernize-use-trailing-return-type]
FastCheckFilter: Strict
UnusedIncludes: Strict
MissingIncludes: Strict
Completion:
AllScopes: Yes
ArgumentLists: FullPlaceholders
HeaderInsertion: IWYU
CodePatterns: All
InlayHints:
Enabled: true
ParameterNames: true
DeducedTypes: true
Designators: true
BlockEnd: false
DefaultArguments: false
TypeNameLimit: 24
.clangd 是 YAML 配置文件。clangd 支持项目配置 .clangd 和用户级 config.yaml;项目配置会从当前文件向父目录查找,适合提交到仓库共享给团队。(Clangd)
CompileFlags 可以增删编译参数,也可以指定 CompilationDatabase;Diagnostics.ClangTidy 可以启用或禁用 clang-tidy 检查;UnusedIncludes 可以开启未使用 include 诊断;Completion.HeaderInsertion: IWYU 代表补全接受时按 “include what you use” 插入头文件;InlayHints 可以控制参数名、推导类型等内联提示。(Clangd)
如果你的 compile_commands.json 不在默认位置,也可以用 .clangd 指定:
CompileFlags: CompilationDatabase: build
官方配置文档说明 CompilationDatabase 可以是目录路径、Ancestors 或 None。(Clangd)
9. .clang-format:格式化配置
在项目根目录新建:
.clang-format
推荐先用命令生成一份:
clang-format -style=llvm -dump-config > .clang-format
clang-format 官方文档说明,可以通过 .clang-format 或 _clang-format 文件配置格式化风格;clang-format -style=llvm -dump-config > .clang-format 是生成完整配置的常用方式。(Clang)
简单版 .clang-format:
BasedOnStyle: LLVM IndentWidth: 4 ColumnLimit: 100 AccessModifierOffset: -4 AllowShortFunctionsOnASingleLine: Empty PointerAlignment: Left SortIncludes: CaseSensitive
VS Code 中格式化:
Shift + Alt + F
或者保存自动格式化:
{
"[cpp]": {
"editor.defaultFormatter": "llvm-vs-code-extensions.vscode-clangd",
"editor.formatOnSave": true
}
}
VS Code clangd 扩展说明,clangd 使用 clang-format 引擎,格式化风格由项目的 .clang-format 控制。(Visual Studio Marketplace)
10. .clang-tidy:静态检查配置
在项目根目录新建:
.clang-tidy
示例:
Checks: > -*, bugprone-*, performance-*, modernize-*, readability-*, clang-analyzer-* WarningsAsErrors: '' HeaderFilterRegex: '.*' FormatStyle: file
clang-tidy 是基于 Clang 的 C++ linter,用于发现典型编程错误、风格问题、接口误用和可静态推导的问题。官方文档说明,clang-tidy 更容易在配置了 compile command database 的项目中工作。(Clang)
clangd 内置了 clang-tidy 的一部分能力,可以在编辑时给出 bug-prone、performance、style 等提示;clangd 也会尊重项目中的 .clang-tidy 文件,但不是所有 clang-tidy 检查都能在 clangd 中工作。(Clangd)
11. VS Code 中常用功能
补全
直接输入对象、函数、命名空间、成员:
std::vec
按 Tab 或 Enter 接受补全。clangd 会基于完整 C++ 解析器和类型信息给出补全。(Visual Studio Marketplace)
跳转
常用快捷键:
| 功能 | 快捷键 |
|---|---|
| Go to Definition | F12 |
| Peek Definition | Alt + F12 |
| Go to Declaration | 右键菜单 |
| Find References | Shift + F12 |
| 全局符号搜索 | Ctrl + T 或 Ctrl + P 后输入 # |
| 当前文件符号搜索 | Ctrl + Shift + O 或 Ctrl + P 后输入 @ |
clangd 支持定义/声明跳转、引用查找、hover、code actions 等 VS Code 功能。(Clangd)
查看 clangd 日志
View → Output → 下拉选择 Clang Language Server
如果需要详细日志:
{
"clangd.arguments": [
"--background-index",
"--clang-tidy",
"--log=verbose"
]
}
clangd 官方排障文档建议在排查问题时查看编辑器暴露的 clangd stderr 日志,并可通过 --log=verbose 获取更详细信息。(Clangd)
12. 构建、运行、调试
推荐:CMake Tools 方式
如果项目是 CMake 工程,推荐用 CMake Tools:
-
Ctrl+Shift+P
-
输入 CMake: Configure
-
选择编译器 Kit
-
输入 CMake: Build
-
输入 CMake: Debug
VS Code 官方 CMake Tools 文档说明,CMake Tools 可以选择 Presets 或 Kits/Variants,执行 CMake: Configure 生成构建文件,执行 CMake: Build 构建项目,执行 CMake: Debug 调试项目。(Visual Studio Code)
推荐配合 CMakePresets.json:
{
"version": 6,
"configurePresets": [
{
"name": "debug",
"displayName": "Debug",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build/debug",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
}
},
{
"name": "release",
"displayName": "Release",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build/release",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release",
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
}
}
],
"buildPresets": [
{
"name": "debug",
"configurePreset": "debug"
},
{
"name": "release",
"configurePreset": "release"
}
]
}
VS Code 官方文档也推荐使用 CMake Presets 管理 CMake 配置,因为它可以把项目配置写进可共享的 JSON 文件,并跨 IDE、跨系统使用。(Visual Studio Code)
纯 VS Code tasks.json 构建单文件
适合学习、刷题、小 demo。
.vscode/tasks.json:
{
"version": "2.0.0",
"tasks": [
{
"label": "build active cpp file",
"type": "shell",
"command": "clang++",
"args": [
"-std=c++20",
"-g",
"-Wall",
"-Wextra",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": []
}
]
}
构建快捷键:
Ctrl + Shift + B
VS Code 的 Tasks 机制可以在 .vscode/tasks.json 中配置脚本或进程,并支持 ${file}、${workspaceFolder} 等变量。(Visual Studio Code)
Linux GDB 调试示例
需要安装 Microsoft C/C++ 扩展或其它调试扩展。clangd 本身不负责调试。
.vscode/launch.json:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug active file with GDB",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb",
"preLaunchTask": "build active cpp file"
}
]
}
VS Code C++ 调试文档说明,不同系统支持不同调试器:Linux 用 GDB,macOS 用 LLDB 或 GDB,Windows 可用 Visual Studio Windows Debugger 或 Cygwin/MinGW 的 GDB。(Visual Studio Code)
13. Windows 常见路线选择
路线 A:LLVM/MinGW + Ninja + GDB
适合想用类 Linux 工具链的人。
大致组合:
clang++ clangd cmake ninja gdb
CMake 配置:
cmake -S . -B build -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Debug cmake --build build
调试用 cppdbg + gdb.exe。
路线 B:MSVC + Ninja + clangd
适合 Windows 原生开发。
在 “Developer PowerShell for VS” 或 “Developer Command Prompt for VS” 中打开 VS Code:
code .
然后:
cmake -S . -B build -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Debug cmake --build build
重点是让 CMake 生成的 compile_commands.json 记录真实的 MSVC/clang-cl 编译参数。clangd 会根据 compilation database 解析项目;如果编译器路径、SDK、标准库头文件路径不对,就会出现找不到头文件的问题。
14. 交叉编译 / 嵌入式项目配置
嵌入式项目经常有自定义编译器,例如:
arm-none-eabi-g++ riscv64-unknown-elf-g++
这时一定要让 compile_commands.json 里出现真实编译器和真实参数,例如:
{
"directory": "/path/to/project/build",
"command": "/opt/gcc-arm/bin/arm-none-eabi-g++ -mcpu=cortex-m4 -mthumb -I../include -DSTM32 -std=c++20 -c ../src/main.cpp",
"file": "../src/main.cpp"
}
如果 clangd 找不到交叉编译器的系统头文件,可以给 clangd 增加 --query-driver 白名单:
{
"clangd.arguments": [
"--background-index",
"--clang-tidy",
"--query-driver=/opt/gcc-arm/bin/arm-none-eabi-*"
]
}
clangd 官方系统头文件文档说明,--query-driver 允许 clangd 执行白名单中的真实编译器来提取 include path 和目标信息;因为它会执行外部二进制,所以不是自动开启,而是需要用户显式 allowlist。(Clangd)
15. 常见问题排查
问题 1:#include <iostream> 找不到
原因通常是标准库头文件没安装,或者 clangd 没找到正确编译器/工具链。clangd 文档说明,它只自带与 clangd 版本相关的内建头文件,不自带 C++ STL;标准库、第三方库、POSIX 头文件等必须由系统或工具链提供。(Clangd)
排查:
clang++ -v -xc++ -c /dev/null
Windows 可用:
clang++ -v -xc++ -c nul
然后看 include search path。
问题 2:项目能编译,但 VS Code 满屏红线
优先检查:
compile_commands.json 是否存在? compile_commands.json 是否在项目根目录或 build/ 下? compile_commands.json 里的 file 路径是否正确? compile_commands.json 里的 command 是否能单独运行? clangd 日志里是否显示 Generic fallback command?
clangd 排障文档说明,如果 clangd 找不到项目内 include,通常意味着没有这个文件对应的 compile command;日志可以告诉你是否找到了 compile_commands.json,以及最终使用了什么编译命令。(Clangd)
问题 3:修改 CMake 后 clangd 没反应
重新生成构建系统:
cmake -S . -B build -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
然后:
Ctrl+Shift+P → clangd: Restart language server
如果你新增了源文件,但 compile_commands.json 没更新,clangd 也不会知道新的编译参数。
问题 4:.h 文件提示不准
头文件本身通常不在 compile_commands.json 里,因为编译数据库主要记录 .c/.cc/.cpp 这类 translation units。解决方法:
-
确保包含该头文件的 .cpp 已经在 compile_commands.json 里;
-
打开相关 .cpp 后再看头文件;
-
对纯头文件库,可以用 compile_flags.txt 或 .clangd 补充 -I、-std=、-D 等参数。
问题 5:clangd 和 Microsoft C/C++ 扩展冲突
表现:
重复补全 重复红线 跳转结果不一致 格式化工具不一致
处理方式:
-
语言服务只保留 clangd;
-
如果必须保留 Microsoft C/C++ 用于调试,尽量关闭它的 IntelliSense/格式化;
-
C/C++ 语义功能、格式化、诊断都交给 clangd。
clangd 官方 VS Code 安装说明建议安装 clangd 扩展时确保 Microsoft C/C++ 扩展未安装;这是为了避免两个 C/C++ 语言服务同时接管同一批文件。(Clangd)
16. 一套推荐的最终配置
项目结构:
my_project/ ├── CMakeLists.txt ├── CMakePresets.json ├── compile_commands.json # 可选:软链接到 build/debug/compile_commands.json ├── .clangd ├── .clang-format ├── .clang-tidy ├── .vscode/ │ └── settings.json ├── include/ └── src/
.vscode/settings.json:
{
"clangd.arguments": [
"--background-index",
"--clang-tidy"
],
"[c]": {
"editor.defaultFormatter": "llvm-vs-code-extensions.vscode-clangd",
"editor.formatOnSave": true
},
"[cpp]": {
"editor.defaultFormatter": "llvm-vs-code-extensions.vscode-clangd",
"editor.formatOnSave": true
},
"editor.inlayHints.enabled": "on",
"cmake.configureOnOpen": true
}
.clangd:
CompileFlags:
Add: [-Wall, -Wextra]
Remove: [-Werror]
Diagnostics:
ClangTidy:
Add: [bugprone-*, performance-*, modernize-*]
Remove: [modernize-use-trailing-return-type]
FastCheckFilter: Strict
UnusedIncludes: Strict
MissingIncludes: Strict
Completion:
AllScopes: Yes
ArgumentLists: FullPlaceholders
HeaderInsertion: IWYU
CodePatterns: All
InlayHints:
Enabled: true
ParameterNames: true
DeducedTypes: true
TypeNameLimit: 24
.clang-format:
BasedOnStyle: LLVM IndentWidth: 4 ColumnLimit: 100 PointerAlignment: Left SortIncludes: CaseSensitive
.clang-tidy:
Checks: > -*, bugprone-*, performance-*, modernize-*, readability-*, clang-analyzer-* WarningsAsErrors: '' HeaderFilterRegex: '.*' FormatStyle: file
17. 使用流程总结
日常开发流程可以固定成这样:
# 第一次配置 cmake -S . -B build -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Debug # 构建 cmake --build build # VS Code 中 # 1. 打开项目根目录 # 2. 等 clangd 索引完成 # 3. 写代码、跳转、补全、格式化 # 4. 用 CMake Tools 或 launch.json 调试
最重要的检查清单:
clangd --version 能运行 VS Code 安装的是 LLVM 的 clangd 扩展 项目有 compile_commands.json compile_commands.json 里的命令真实可用 .vscode/settings.json 没让多个 C++ IntelliSense 引擎互相抢活 .clang-format 控制格式化 .clang-tidy / .clangd 控制静态检查
把这套跑通后,VS Code + clangd 的体验基本就接近轻量级 C++ IDE 了。