前言

本文采用的SDK是北京迅为电子的iTOP-RK3568开发板,其他瑞芯微SDK原理是一样的。Bear 会在编译 Linux 源码时捕获每个源文件真实使用的编译命令,并生成 compile_commands.json;clangd 再根据这些编译参数正确解析代码,给 VS Code 提供跳转、补全和语义分析能力

一、 准备Linux环境

1.推荐使用WSL2,管理员身份打开PowerShell :

wsl --install -d Ubuntu-20.04	#或其他版本

2.下载vscode 扩展
下载vscode ssh插件
WSL扩展
3.vscode进入WSL
在这里插入图片描述

二、编译Linux内核源码

1.将SDK存放到/home/用户/下,可直接复制进去:
在这里插入图片描述
2.解压后执行build.sh脚本得到make命令

zhengshuo@zheng:~/rksdk/rk3568-linux-6.1-stan-rkr6$ ./build.sh kernel

执行一会儿后Ctrl +C中断:
在这里插入图片描述

记录下来这这两条命令,稍后会进入kernel目录配置编译内核

make -C /home/zhengshuo/rksdk/rk3568-linux-6.1-stan-rkr6/kernel/ -j21 CROSS_COMPILE=/home/zhengshuo/rksdk/rk3568-linux-6.1-stan-rkr6/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- ARCH=arm64 rockchip_linux_defconfig rk3568.config
make -C /home/zhengshuo/rksdk/rk3568-linux-6.1-stan-rkr6/kernel/ -j21 CROSS_COMPILE=/home/zhengshuo/rksdk/rk3568-linux-6.1-stan-rkr6/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- ARCH=arm64 topeet-rk3568-linux.img

3.安装bear,clangd

sudo apt update
sudo apt install bear  #安装bear

#安装新版本clangd
sudo apt install -y wget gnupg ca-certificates
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 20

sudo apt install -y clangd-20
sudo update-alternatives --install /usr/bin/clangd clangd /usr/bin/clangd-20 100
zhengshuo@zheng:~/rksdk/rk3568-linux-6.1-stan-rkr6$ clangd --version
Ubuntu clangd version 20.1.8 (++20250708083436+6fb913d3e2ec-1~exp1~20250708203453.133)
Features: linux
Platform: x86_64-pc-linux-gnu

4安装vscode clangd扩展
只在WSL安装即可,如果本机也自动装上了,就退出WSL,然后卸载本地clangd扩展,不然会和c/c++插件冲突
在这里插入图片描述
5. 配置clangd

进入kernel目录,编写.clangd文件:

CompileFlags:   # 对 clangd 看到的编译命令进行调整,不影响真正的 make 编译
  Remove:       # 从 compile_commands.json 提供的编译参数里删掉下面这些选项
    - -mabi=lp64                         # 删除 ARM64 的 ABI 参数,避免 clangd 在解析时被这个 GCC 参数影响
    - -fno-allow-store-data-races       # 删除 GCC/内核相关优化参数,减少 clangd 解析失败的概率
    - -fconserve-stack                  # 删除控制栈使用的 GCC 参数,避免 clangd 对该参数兼容不好
    - -mstack-protector-guard=*         # 删除所有以 -mstack-protector-guard= 开头的参数,比如 =sysreg
    - -mstack-protector-guard-reg=*     # 删除所有以 -mstack-protector-guard-reg= 开头的参数,比如 =sp_el0
    - -mstack-protector-guard-offset=*  # 删除所有以 -mstack-protector-guard-offset= 开头的参数,比如 =1328

6.编译内核,生成compile_commands.json文件

#在kernel目录执行前面保存的两条命令(编译内核前面加bear命令)
make clean
make -C /home/zhengshuo/rksdk/rk3568-linux-6.1-stan-rkr6/kernel/ -j21 CROSS_COMPILE=/home/zhengshuo/rksdk/rk3568-linux-6.1-stan-rkr6/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- ARCH=arm64 rockchip_linux_defconfig rk3568.config
bear make -C /home/zhengshuo/rksdk/rk3568-linux-6.1-stan-rkr6/kernel/ -j21 CROSS_COMPILE=/home/zhengshuo/rksdk/rk3568-linux-6.1-stan-rkr6/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- ARCH=arm64 topeet-rk3568-linux.img

在这里插入图片描述

三、触发clangd解析

在这里插入图片描述

重启vscode,这里打开init目录下的main.c文件(任意c文件均可),触发解析(在当前内核目录会生成.cache),实现精确跳转

精准跳转与宏展开

四、其他

1.关闭波浪线
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

{
  "problems.visibility": false
}

2.上下文插件,类似sourceinsight的Context Window
在这里插入图片描述
安装扩展后,新建终端,多出CONTEXT选项
在这里插入图片描述
3.若无法跳转,可尝试修改 “四、1“ 中的配置:

{
  // 隐藏 Problems 面板
  "problems.visibility": false,

  // 指定 clangd 可执行文件路径
  "clangd.path": "/usr/bin/clangd",

  // 传给 clangd 的启动参数
  "clangd.arguments": [
    // 允许 clangd 查询这个交叉编译器的信息
    "--query-driver=/home/zhengshuo/rksdk/rk3568-linux-6.1-stan-rkr6/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc"
  ]
}

更多推荐