vscode 使用clangd浏览代码
自行搜索安装vsocode,windows平台或者Mac平台。个人一般在windows安装vscode,通过vscode官方插件remote ssh 远程到linux平台开发,本文也主要介绍window下远程linux时clangd的使用,为自己做个记录。
一、vscode 环境准备
自行搜索安装vsocode,windows平台或者Mac平台。个人一般在windows安装vscode,通过vscode官方插件remote ssh 远程到linux平台开发,本文也主要介绍window下远程linux时clangd的使用,为自己做个记录。
二、linux环境下准备
在linux下安装clang,lldb,llvm,clangd
apt install clang-14
apt install llvm-14
apt install lldb-14
apt install clangd-14
#xxx-14,是选择clang llvm 的版本为14,ubuntu下也可以不带-14,使用默认版本.
#ubuntu22.04的默认版本就是14
#请自行搜索clang llvm lldb clangd的作用;
#主要使用的clangd,作为lsb后端解析代码,实现跳转,补全等功能
三、window下环境准备
vsocde安装clangd插件及常用的插件。根据需要按住插件。
四、clangd配置
clangd配置分为用户配置和工作区配置和插件配置。
插件配置:就是在vscode的用户配置或者工作区配置中修改的插件配置。贴一下.vscode下setting.json文件中的clangd插件配置。:
{
"terminal.integrated.defaultLocation": "editor",
"clangd.path": "/usr/bin/clangd",
"C_Cpp.intelliSenseEngine": "disabled",
"workbench.editor.enablePreview": false,
"clangd.arguments": [
"--background-index",
"--compile-commands-dir=${workspaceFolder}/.vscode",
"-j=4",
"--query-driver=/usr/bin/clang++",
"--clang-tidy",
"--clang-tidy-checks=performance-*,bugprone-*",
"--all-scopes-completion",
"--completion-style=detailed",
"--header-insertion=iwyu",
"--pch-storage=disk",
],
}
此时须指定compile_commands.json文件的路径,"--compile-commands-dir=${workspaceFolder}/.vscode",用来指定compile_commands.json所在的路径。下面回说明compile_commands.json的文件是什么。
注意:clangd.arguments这个是vscode在clangd启动时,传递给clangd的参数。作用于clangd启动时的行为,不作用在代码层。然后下面的用户配置和项目配置是作用于代码的,控制代码的跳转、警告的一些行为的。同时clangd.arguments也是对全局配置和项目配置的一个补充 。优先级:clangd.arguments>项目.clangd >用户全局配置。
用户配置:是全局配置,一般位于用户的配置文件下,下面是不同平台的配置目录
Windows:C:\Users\XXXX\AppData\Local\clangd\config.yaml
macOS::~/Library/Preferences/clangd/config.yaml
Linux :~/.config/clangd/config.yaml
项目配置:项目的配置文件位于当前工作目录下,名称为.clangd。这个文件只影响当前的项目
注意:用户配置和项目配置的文件都是YAML语法的,注意缩进和符合。
常用配置如下:
If: # 设置配置文件的使用条件
PathMatch: .*\.h # 所有头文件都使用
PathExclude: include/llvm-c/.* # 排除该路径下的所有文件
CompileFlags: # 编译标志部分
Add:
- "-Wall" # 启用所有警告
- "-Wextra" # 启用额外警告
- "-std=c++20" # 使用C++20标准
- "-Iinclude" # 包含头文件, 相对路径
- "-isystemF:/include" # 包含头文件, 绝对路径
Remove: ["-Werror"] # 移除将所有警告作为错误的选项
Compiler: clang++ # 指定编译器
Index:
Background: true # 在后台索引项目代码
BuildSystem: "CMake" # 指定构建系统类型
IndexFile: ".clangd-index" # 索引文件路径
ImplicitDynamic: true # 动态索引所有头文件
ResourceDir: "/path/to/resource" # 资源目录路径
Diagnostics: # 诊断设置部分
ClangTidy: # Clang-Tidy 配置
Add: ["cppcoreguidelines-*", "modernize-*", "performance-*"]
# 添加Clang-Tidy检查项, 其含义参见https://clang.llvm.org/extra/clang-tidy/
Remove: ["clang-analyzer-*"] # 移除Clang分析器检查项
ClangTidyChecks: true # 启用 Clang-Tidy 检查
Options: # Clang-Tidy 的选项设置
UseChecks: ["*"] # 使用所有检查项
HeaderFilterRegex: ".*" # 正则表达式,用于过滤头文件
WarningsAsErrors: "cppcoreguidelines-*" # 将特定警告视为错误
InlayHints: # 代码提示设置部分
Enabled: true # 启用代码提示
ParameterNames: true # 显示参数名称提示
DeducedTypes: true # 显示推断类型提示
Designators: true # 显示设计器提示
Completion: # 代码补全设置部分
AllScopes: true # 启用所有作用域的代码补全
Brackets: "[]" # 补全时使用的括号类型
SemanticTokens: # 语义标记设置部分
Enabled: true # 启用语义标记
DisabledKinds: ["Macro"] # 禁用宏语义标记
DisabledModifiers: ["Static"] # 禁用静态修饰符语义标记
#.clangd 是 clangd 语言服务器的核心配置文件,用于 项目级或用户级的代码分析行为定制,主要功能包括:
#1、编译参数:指定头文件路径、宏定义、C++ 标准等(替代 compile_commands.json)。
#2、诊断控制:禁用特定警告或错误,调整第三方库的警告范围。
#3、补全优化:过滤无关建议或调整补全优先级。
#4、索引配置:控制符号索引的范围和性能优化。
#5、格式化风格:集成 clang-format 规则(如缩进、括号风格)。
五、生成compile_commands.json
CMake管理的工程,有2中方式生成compile_commands.json
- 直接修改CMakeLists.txt文件,在文中添加:
set (CMAKE_EXPORT_COMPILE_COMMANDS ON)
- 执行cmake时候,添加生成compile_commands.json的参数
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=on
Makefile的工程
安装bear
sudo apt install bear
生成compile_commands.json
bear make
#bear -- make 不同版本可能命令不同
六、其他
clangd.fallbackFlags
是 编辑器插件(如 VS Code)中配置 clangd 的选项。当 clangd 无法自动获取编译命令(例如项目没有 compile_commands.json
,且未配置 .clangd
文件中的 CompileFlags
)时,fallbackFlags
会作为默认参数传递给 clangd,帮助它正确解析代码(如头文件路径、宏定义、C++ 标准等)。
setting.json中添加配置
{
"clangd.fallbackFlags": [
"-I/usr/local/include", // 指定头文件路径
"-I${workspaceFolder}/include", // 使用变量指向项目内的头文件
"-DDEBUG", // 定义宏
"-std=c++17", // 指定 C++ 标准
"-Wall", // 启用所有警告
"-Wno-unused-variable" // 忽略特定警告
]
}
关键注意事项
- 如果项目存在 compile_commands.json 或 .clangd 中的 CompileFlags,fallbackFlags 会被忽略。仅在 clangd 无法获取其他编译信息时生效。
- 编辑器插件专属配置,fallbackFlags 是编辑器插件(如 VS Code 的 clangd 扩展)的配置项,不是 clangd 的原生配置。
更多推荐
所有评论(0)