vscode clangd插件使用

本文最后更新于:2025年11月19日 下午

以前用的微软的c/c++插件来进行代码分析,跳转。分析代码很慢,磁盘占用多。没分析完时很难跳转。

前置工作

clangd分析代码一样需要编译数据库文件(compile_commands.json),需要先准备好这个文件。可以使用bear来捕获生成。

安装

(1)vscode安装clangd插件

(2)ubuntu上安装clangd。

1
sudo apt install clangd

ubuntu上也可以不安装clangd,vscode里面会提示你安装,会装在vscode目录。vscode里面安装的clangd版本会更高一些。建议使用这种。

配置clangd

compile_commands.json路径

装上之后可能第一个需要配置的就是compile_commands.json 位置,默认会在工程路径下查找。如果需要单独指定,那么配置clangd的命令行参数。
--compile-commands-dir=your_dir

分析代码的核心数

配置命令行参数-j=10

1
2
3
"clangd.arguments": [
"-j=10",
]

关闭自动插入头文件

针对复杂的工程,clangd可能会插入错误的头文件。所以关闭它。

1
--header-insertion=never

format

禁用c/c++插件后,格式化不能用了,需要选择clang。默认的clang格式化风格跟自己的不符。需要配置。
--fallback-style=Microsoft
也可以使用自定义格式,如下方法,在工作区生成.clang-format。

1
2
3
4
sudo apt install clang-format

# 工作区运行生成.clang-format文件
clang-format --style=Microsoft --dump-config > .clang-format

这样就可以了,也可以根据需要深入修改这个文件。

clang-tidy

没看出来作用。简单的malloc,fopen描述符泄露都看不出来。

和微软的c/c++插件共存

网上有人说二者冲突,要禁用c/c++插件,实则没有。只是两个都启用时,都会分析代码,无疑是多余的。
只需要关闭c/c++插件的代码分析和补全就好了。

1
2
"C_Cpp.intelliSenseEngine": "disabled",
"C_Cpp.autocomplete": "disabled"

这样也可以使用c/c++插件的debug功能了。

资源占用

工作区编译的文件有13000多个,分析完之后,clangd内存占用2G,磁盘缓存占用290M。下次打开工作区,能很快分析完。

遇到的问题

内核文件解析报错

关键错误信息为:

1
Failed to prepare a compiler instance: unknown target ABI 'lp64'

查了下,clangd好像处理不了编译标志-mabi=lp64,这个issue还没解决的。
只能自己删除compile_commands.json里面的这个标志。

1
sed -i '/mabi=lp64/ d' compile_commands.json

推荐使用下面的编译标志报错方法解决。

一些编译标志报错

文件可以正常解析,但是clangd的状态会显示文件报错,说未知的标志。

1
"Unknown argument: '-fno-allow-store-data-races'"

可以通过配置clangd的配置文件来移除这些标志。这些标志位基本都是指导gcc如果编译代码的,对语义分析影响不大。
针对用户的配置文件为:~/.config/clangd/config.yaml
针对工作区的配置文件为:工作区目录/.clangd
添加如下配置让clangd解析时移除这些标志即可,如:

1
2
3
CompileFlags:
# clangd处理这些标志会报错
Remove: [-mno-thumb-interwork, -ffixed-r8, -fno-allow-store-data-races, -mabi=lp64]

[文档][https://clangd.llvm.org/config#files]

我的~/.config/clangd/config.yaml配置为

1
2
3
CompileFlags:
# clangd处理这些标志会报错
Remove: [-mno-thumb-interwork, -ffixed-r8, -fno-allow-store-data-races, -fno-var-tracking-assignments,-mlong-calls, -fconserve-stack, -mabi=*, -mno-check-zero-division, -mno-abicalls, -G]

realtek方案遇到的问题
遇到这个错unknown target CPU 'mips32r2'
编译选项里面有-march=mips32r2, 编译标志里面移除它就好了。最终解决方法时,在工作区目录创建.clangd文件

1
2
3
4
5
6
7
8
9
10
11
CompileFlags:
# 指定交叉编译器,让 clangd 能调用它获取系统 include 路径
Compiler: /home/leon/code/rtl-ax1500/rtl819x/toolchain/msdk-6.4.1-mips-EL-4.4-u0.9.33-m32ut-190619/bin/msdk-linux-gcc

# 移除 clang 不认识的 flag(这些在 GCC 下正常,但 clang 会报错)
Remove:
- -mabi=*
- -march=*
- -EL
- -msoft-float
- -Wa,*

找不到头文件

有时还会遇到文件无法解析,说找不到头文件。原因为存在多个compile_commands.json。虽然外层的有这个文件的编译命令,但是最里层的compile_commands.json为空,导致无法解析这个文件。删除里层的就好。


vscode clangd插件使用
https://leon0625.github.io/2024/02/22/5086bb846897/
作者
leon.liu
发布于
2024年2月22日
许可协议