VSCode+clangd阅读linux内核源码

本文介绍如何在VSCode中配置Clangd插件,实现C/C++代码的精准跳转与补全功能。包括安装Clangd、Bear等工具,以及生成compile_commands.json文件的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. clangd 原理介绍

clangd 插件用于代码语义分析、代码补全、跳转等。能做到代码精准跳转、精准自动补全,其根本原理是通过读取工程编译自动生成的compile_commands.json 文件来索引其中包含的源文件和关联的头文件,因此能避免索引非编译的代码造成解析时语义混乱。

compile_commands.json 文件就是由每个源文件的编译参数、路径等信息组成的一个json文件,clangd 通过这个文件可以准确定位源文件需要引用的头文件从而准确的找到各种宏定义、函数、变量声明的准确值了。

那么问题来了,编译内核的时候也没有生成compile_commands.json这个文件呀。这个文件在编译cmake工程的时候可以自动生成,但是内核用的是make。这时候就需要另一个工具bear了,他就是专门用来生成这个的。clangd 阅读环境具体安装配置如下:

2. 环境配置

2.1 安装插件

​ 打开vscode后,点击左侧图标:

05_vscode_homepage

依次输入下列插件名字,安装:

C/C++
C/C++ Extension Pack
C/C++ Snippets
Code Runner
Code Spell Checker
compareit
DeviceTree
Tabnine AI Autocomplete
Bracket Pair Colorization Toggler
Rainbow Highlighter
高亮文字:shift + alt + z
取消高亮:shift + alt + a
Arm Assembly
Chinese
Hex Editor
One Dark Pro
Clangd--->代码跳转插件
Markdown All in One
Markdown Preview Enhanced

相关插件如下:

06_vscode_plug

2.2 配置clangd

2.3.1 下载clangd

前面只是安装clangd插件,它的使用还需要一个clangd程序。

我们以后使用vscode打开C文件时,会提示你安装clangd程序,它会安装最先版本(版本15),但是这个版本有一些Bug,所以我们手工安装版本13。

在Ubuntu中使用浏览器打开https://github.com/clangd/clangd/releases/tag/13.0.0,下载Linux安装包:

07_clangd_package

把下载到的clangd-linux-13.0.0.zip放到/home/book目录下,执行解压命令:

cd /home/book
unzip clangd-linux-13.0.0.zip

2.2.2 配置clangd

在vscode界面按下图步骤打开setting.json文件:

08_clangd_setting_config

在setting.json中写入如下内容(我们第1次打开源码目录后,这个文件可能被自动修改,你需要再次修改它):

{
    "C_Cpp.default.intelliSenseMode": "linux-gcc-arm",
    "C_Cpp.intelliSenseEngine": "Disabled",
    "clangd.path": "/home/book/clangd_13.0.0/bin/clangd",
    "clangd.arguments": [
        "--log=verbose",
    ],
}

C/C++插件里的intellisense和clangd是冲突的,如果我们没有手工设置setting.json,当使用vscode打开C文件时时会提示禁止intellisense,点击鼠标即可禁止。它的本质也是修改setting.json,它会写入如下文字:

"C_Cpp.intelliSenseEngine": "disabled",

上面文件有Bug,其中的"disabled"应该改为"Disabled"。

2.2.3 安装bear

在vscode中使用clangd,要实现精确跳转,需要使用bear分析源码生成compile_commands.json。

执行如下命令安装:

sudo apt instll bear

3. 下载和编译内核

以百问网IMX6ULL_Pro开发板为例。

3.1 下载内核

执行如下命令:

$ git clone https://e.coding.net/codebug8/repo.git
$ mkdir -p 100ask_imx6ull-sdk && cd 100ask_imx6ull-sdk
$ ../repo/repo init -u https://gitee.com/weidongshan/manifests.git -b linux-sdk -m imx6ull/100ask_imx6ull_linux4.9.88_release.xml --no-repo-verify
$ ../repo/repo sync -j4

3.2 配置工具链

执行如下命令:

gedit  ~/.bashrc

在最后加入如下内容:

export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin

重新关闭、打开终端。

3.3 编译内核

执行如下命令:

$ cd /home/book/100ask_imx6ull-sdk/Linux-4.9.88
$ make 100ask_imx6ull_defconfig
$ make zImage -j4

4. 使用vscode阅读内核源码

4.1 生成compile_commands.json

bear命令用来生成compile_commands.json,它的用法如下:

bear make [其他make本身的参数] // bear 3.0之前的版本
bear -- make [其他make本身的参数] // bear 3.0之后的版本
bear --version //查看版本

注意:根据 ubuntu 版本的不同执行sudo apt instll bear 命令生成本执行规则有所不同

它会记录make过程编译文件时用到的命令。

编译内核时,使用如下命令:

// 如果之前曾经编译过内核,要清除掉
make clean  

// 然后重新编译
bear make zImage -j 4

编译成功后就会在当前目录下得到文件compile_commands.json,bear 3.0前的版本生成的compile_commands.json需要如下修改:

09_compile_commands_json

在gedit中使用快捷键"Ctrl+H"即可如下操作

10_compile_config

4.2 使用VScode 打开内核工程文件

4.2.1 触发clangd建立索引

11_clangd_indexes

如果没有看到上述状态,可以如下处理:

  • 按照《2.2.2 配置clangd》重新编辑setting.json
  • 重新启动vscode、重新打开内核源码目录、重新打开C文件

在创建索引的过程中,可以使用如下命令查看.cache目录,它会不断变大(最终大小在60M左右):

12_clandg_cache

4.2.2 验证

13_test_clandg

参考链接:https://blog.csdn.net/thisway_diy/article/details/127426986?spm=1001.2014.3001.5501

​ https://zhuanlan.zhihu.com/p/558286384?utm_id=0

Clangd是一个用于代码语义分析、代码补全和跳转等功能的插件,它能够实现代码的精准跳转和自动补全。它的工作原理是通过读取工程编译自动生成的compile_commands.json文件来索引源文件和关联的头文件,从而避免解析时的语义混乱。\[2\] 在VScode中使用Clangd需要进行一些配置。首先,需要在setting.json文件中添加以下内容: ``` { "C_Cpp.default.intelliSenseMode": "linux-gcc-arm", "C_Cpp.intelliSenseEngine": "Disabled", "clangd.path": "/home/book/clangd_13.0.0/bin/clangd", "clangd.arguments": \[ "--log=verbose" \] } ``` 其中,"C_Cpp.default.intelliSenseMode"设置为"linux-gcc-arm","C_Cpp.intelliSenseEngine"设置为"Disabled","clangd.path"设置为Clangd的安装路径,"clangd.arguments"可以根据需要添加其他参数。\[3\] 使用Clangd可以明显降低系统资源的占用,减少系统卡顿的情况,但是使用门槛较高。对于大型项目来说,使用Clangd更适合,而C/C++更适合小项目的开发,使用起来更加便利,能够更好地进行调试。\[1\] #### 引用[.reference_title] - *1* [VScodeClangd 使用](https://blog.csdn.net/qq_39852676/article/details/124517986)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [VSCode+clangd阅读linux内核源码](https://blog.csdn.net/weixin_40209493/article/details/128175003)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Engineer-Jaylen_Sun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值