clangd插件以及clangd LSP语言服务,实现代码的补齐和代码跳转功能,其原理是
- 利用cmake、xmake、ninja的编译命令导出功能产生compile_commands.json
- 利用bear工具捕捉makefile的编译命令生成compile_commands.json
- 工程本身makefile支持生成compile_commands.json,该种情况下要求clangd LSP语言服务版本号大于11.
clangd插件VSCode配置setting.json
安装VSCode的clangd插件比较简单,不述。
- clangd.path为clangd语言服务进程位置,一般VSCode自动安装的位置在~/.vscode-server/data/User/globalStorage/llvm-vs-code-extensions.vscode-clangd/install下,手动安装的设置正确的路径即可。
- C_Cpp.intelliSenseEngine设置为disabled,是为了解决clangd和C/C++两个插件都提供的C++ language server功能在同一个vscode项目中同时启动的冲突。
- --compile-commands-dir=${workspaceFolder}设置在当前工程目录下找compile_commands.json和.clangd文件。
- --background-index在后台建立源码工程索引。
- editor.fontFamily设置候选的显示字体。
clangd默认开启format on save功能,会对整个文件重新格式化。如果不需要这样,可以禁止format on save功能(Ctrl+Shift + P, Setting-clangd默认开启format on save功能,会对整个文件重新格式化。如果不需要这样,可以禁止format on save功能(Ctrl+Shift + P, Setting---> Preferences: Open Folder Settings),如下所示

源码
创建VSCode workspace
SSH远程登录远程机器上,创建类似v1sdk.code-workspace VSCode工作区文件即可。
cat v1sdk.code-workspace
{
"folders": [
{
"path": "./v1sdk"
}
]
}
然后VSCode远程开发插件remote-ssh直接登录远程机器上File -> Open Workplace from这个工作区文件即可。
compile_commands.json的生成
编译整个工程生成
#生成compile_commands.jsonout/debug-gcc_12.2-64/build$ python3 ../../../kernel/scripts/clang-tools/gen_compile_commands.py
#移到工程根目录
out/debug-gcc_12.2-64/build$ mv compile_commands.json ../../../
Linux makfile生成compile_commands.json方法
Linux kernel在支持生成compile_commands.json,只需要在kernel代码文件夹下使用命令(以arm64为例):
整个操作过程如下:
- 确认clang 编译器版本和支持,后边要用到,若无,Ubuntu安装:sudo apt install clang。注意是clang,不是clangd。
# which clang- +TAB键选一个数字大的,至少是clang-11
~$ which clang-clang-14 clang-cpp-14 clang-format clang-format-14 clang-format-diff clang-format-diff-14
编译kernel所需要的.config文件生成
2种方法:
从其他工程copy过来。
工程生成
$ export srctree=$(pwd) $ export OUTPUT_BUILD_DIR=${srctree}/../out$ make hobot_j6e_defconfig #若是有config选项需要你确认,看自己情况一般选择N,比如:Use pointer authentication for kernel (ARM64_PTR_AUTH_KERNEL) [Y/n/?] (NEW) n- 编译kernel生成compile_commands.json。
$ HEADER_DIRS="-Idrivers/tty/serial/8250 -Idrivers/i2c/busses -I../hobot-drivers/i2c -I../hobot-drivers/fusa/diag -I../hobot-drivers/syscon" $ make EXTRA_CFLAGS="$HEADER_DIRS" ARCH=arm64 SUBARCH=arm64 CC=clang-14 CROSS_COMPILE=aarch64-linux-gnu- compile_commands.json -j32 $ du -sh compile_commands.json 9.8M compile_commands.json以上是V1.0编译所需要的头文件包含,编译过程中若有编译错误,需要自行解决。
移动compile_commands.json到vscode的根目录,即kernel目录的上一级目录。
.clangd
clangd无法识别一些gcc,g++的编译命令需将这些编译命令剔除,否则clangd无法正常工作。需要在kernel目录下增加.clangd文件,内容如下。
一些清理工作
查看clangd LSP是否正常工作
在第4步完成后,需要关闭VSCode,然后重新打开第3步所设置的Workspace。刚刚打开后VSCode状态栏会出现如下indexing转圈,则说明clangd LSP正常工作了。

- 也可以查看工程根目录下.cache/clangd是否索引数据库生成,若有则说明clangd LSP正常工作了。
若不正常工作,可以点开clangd:idle查看下相关log解决。
MCU工程
创建VSCode workspace
{
"folders": [
{
"path": "../xx/v10MCU/mcu"
}
]
}
然后VSCode远程开发插件remote-ssh直接登录远程机器上File -> Open Workplace from这个工作区文件即可。
生成MCU的compile_commands.json
- 修改编译系统Build/Autosar/build_autosar.py或Build/FreeRtos/build_freertos.py
bear_config_ghs.json 配置
- 正常编译,compile_commands.json生成在工程目录的mcu目录里。
.clangd
CompileFlags:
Add: --target=arm-none-eabi
Remove: -mabi=lp32
高效工作快捷键
移动光标到行首: home
移动光标到行尾: end
跳转文档头部: Ctrl+home
跳转文档尾部: Ctrl+end
花括号跳转: Ctrl+Shift+\
文件跳转:Ctrl+P
行跳转:Ctrl+G
文件夹和workspace跳转: Ctrl + R
Alt + ← (Windows/Linux) 或 Ctrl + ← (macOS) - 光标回到上一个编辑的位置。
Alt + → (Windows/Linux) 或 Ctrl + → (macOS) - 光标回到下一个编辑的位置。
Ctrl + Tab 在打开的编辑器之间切换。
Ctrl + P 打开@Symbol模式,输入符号名可快速跳转到该符号定义处。
F12 跳转到当前光标下符号的定义处。
Find All References: Shift+Alt+F12
批量修改:F2
VSCode+clangd 代码浏览常用操作
- Ctrl + 左键单击变量/函数,可以跳到定义处。
- Shift + F12变量/函数,可以列出该变量/函数在当前文件中所有的引用处。
- Find symbol in file (Ctrl-P @foo) or workspace (Ctrl-P #foo).
- 悬停提示:鼠标悬停(或按Ctrl-K)。
