1. clangd 原理介绍
clangd
插件用于代码语义分析、代码补全、跳转等。能做到代码精准跳转、精准自动补全,其根本原理是通过读取工程编译自动生成的
compile_commands.json
文件来索引其中包含的源文件和关联的头文件,因此能避免索引非编译的代码造成解析时语义混乱。
compile_commands.json
文件就是由每个源文件的编译参数、路径等信息组成的一个
json
文件,
clangd
通过这个文件可以准确定位源文件需要引用的头文件从而准确的找到各种宏定义、函数、变量声明的准确值了。
那么问题来了,编译内核的时候也没有生成
compile_commands.json
这个文件呀。这个文件在编译
cmake
工程的时候可以自动生成,但是内核用的是make。这时候就需要另一个工具bear了,他就是专门用来生成这个的。clangd 阅读环境具体安装配置如下:
2. 环境配置
2.1 安装插件
打开vscode后,点击左侧图标:
依次输入下列插件名字,安装:
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
相关插件如下:
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安装包:
把下载到的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文件:
在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。
执行如下命令安装:
sudoapt 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
在最后加入如下内容:
exportARCH=arm
exportCROSS_COMPILE=arm-buildroot-linux-gnueabihf-
exportPATH=$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 -j4
编译成功后就会在当前目录下得到文件compile_commands.json,bear 3.0前的版本生成的compile_commands.json需要如下修改:
在gedit中使用快捷键"Ctrl+H"即可如下操作
4.2 使用VScode 打开内核工程文件
4.2.1 触发clangd建立索引
如果没有看到上述状态,可以如下处理:
- 按照《2.2.2 配置clangd》重新编辑setting.json
- 重新启动vscode、重新打开内核源码目录、重新打开C文件
在创建索引的过程中,可以使用如下命令查看.cache目录,它会不断变大(最终大小在60M左右):
4.2.2 验证
参考链接:https://blog.csdn.net/thisway_diy/article/details/127426986?spm=1001.2014.3001.5501
版权归原作者 Engineer-Jaylen_Sun 所有, 如有侵权,请联系我们删除。