VSCode+clangd阅读linux内核源码_bear -- make-程序员宅基地

技术标签: Linux驱动  vscode  linux  ide  

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_40209493/article/details/128175003

智能推荐

ftp服务器与共享文件对比,ftp服务器与共享的区别-程序员宅基地

文章浏览阅读4.9k次。ftp服务器与共享的区别 内容精选换一换ר��������Dedicated Host��DeH������ָ�û��ɶ����ר������������Դ�������Խ��Ʒ���������������ר�������ϣ��������Ը����ԡ���ȫ�ԡ����ܵĸ���Ҫ��ͬʱ������������Ǩ��ҵ����ר������ʱ������ʹ��Ǩ��ǰ�ķ����������..._server u和共享文档的区别

深入理解Android之AOP_android日志aop函数-程序员宅基地

文章浏览阅读9.1w次,点赞67次,收藏226次。深入理解Android之AOP格式更加精美的PDF版请到:http://vdisk.weibo.com/s/z68f8l0xTgCLK 下载一、闲谈AOP大家都知道OOP,即ObjectOriented Programming,面向对象编程。而本文要介绍的是AOP。AOP是Aspect Oriented Programming的缩写,中译文为面向切向编程。OOP和AOP是什么关系呢?首先:l OO_android日志aop函数

如何学习编程-程序员宅基地

文章浏览阅读126次。这个问题在how to become a hacker一文中有很精辟的介绍。按照作者的观点,程序员应该学习的语言是:python,java,c/c++,perl,lisp。对于天朝的程序员来说,还应该加上english。

kubernetes1.5.2--部署dashboard服务_kubernetes v1.5.2适用哪个版本dashboard-程序员宅基地

文章浏览阅读2.5k次。使用http方式访问api server的部署cat dashboard-controller.yaml apiVersion: extensions/v1beta1kind: Deploymentmetadata: labels: k8s-app: kubernetes-dashboard kubernetes.io/cluster-service: "true"_kubernetes v1.5.2适用哪个版本dashboard

在java中使用FreeMark导出数据到excel表格_java freemark <ss:interior-程序员宅基地

文章浏览阅读1w次。主要有一下几步:1.导入需要的jar:freemarker-2.3.19.jar。2.根据需要作出导出模板3.在WebRoot下面建template文件夹,把制作的模板扔到这个文件夹下面4.编写核心代码具体实施细节:制作模板:_java freemark

NoSQL数据库笔谈 转载-程序员宅基地

文章浏览阅读545次。NoSQL数据库笔谈 转载 NoSQL数据库笔谈NoSQL数据库笔谈appdir , ssv , paper颜开 , v0.2 , 2010.2 序 思想篇 CAP 最终一致性 变体 BA..._颜开 道客云

随便推点

计算机组装过程中需要注意什么,PCB组装过程中需要注意哪些问题-程序员宅基地

文章浏览阅读137次。PCB是小型玩具或复杂计算机的任何电子设备的组成部分。其复杂的互连组件包括电阻器,二极管,电容器等,使器件能够串联工作。从某种意义上说,它就像是系统的“大脑”。在高可靠性系统中 - 尤其是石油钻井,太空卫星和其他故障可能会产生破坏性后果。这是至关重要的,因此PCB组装过程是完美无缺的,并且组装中常见的错误被注意到。以下是需要注意的一些因素:供应链管理 -为了能够创建高质量的PCB,需要整理的一件事..._组装耳机pcb问题注意事项

retrofit2.adapter.rxjava.HttpException: HTTP 504 Unsatisfiable Request (only-if-cached)_retrofit2.adapter.rxjava2.httpexception: http 504 -程序员宅基地

文章浏览阅读3.9k次。retrofit2.adapter.rxjava.HttpException: HTTP 504 Unsatisfiable Request (only-if-cached)03-31 10:57:21.473 5267-5267/com.moreunion.zhenghao W/System.err: at retrofit2.adapter.rxjava.OperatorMapResp..._retrofit2.adapter.rxjava2.httpexception: http 504 unsatisfiable request (onl

Power BI--如何给堆积条形图增加总计-程序员宅基地

文章浏览阅读7.5k次。在Power BI报表中,堆积条形图的使用场景还是比较多的,比如下图的销售趋势图表中,既可以看到整体的销售趋势,又可以看到不同品牌(通过颜色来区分)的销售趋势。但是,如果想知道每一周的总体销售额,这张图中就只能手工将三个品牌的值加起来计算了。我们可以通过两种变通的方法,在图表中展示出”总计”功能:第一种方法比较简单:将”堆积条形图”切换成”折线和堆积柱形图”,把销售总金额字段拖到”Li...

MQTT简介之六 MQTT 5.0_disconnect:notification-程序员宅基地

文章浏览阅读217次。•用户属性 ( User Properties ) •有效载荷格式指示符和内容类型 ( Payload Format Indicator & Content Type ) •共享订阅 ( Shared Subscriptions ) •原因代码和原因字符串(Reason Codes & Reason Strings) •会话管理:会话到期和消息到期 (Session management: Session Expiry & Message Expiry)•在..._disconnect:notification

微信公众号JS接口安全域名配置:config:fail,invalid url domain-程序员宅基地

文章浏览阅读10w+次,点赞4次,收藏2次。在配置微信公众号时,我们经常先是用测试账户管理进行配置,毕竟是开发模式,往往会出现以下问题:config:fail,invalid url domain。注册微信服务报错,如何解决?解决:你配置的url是否正确?有没有把http去掉呢?正确 URL:hzwxgzh.s2.natapp.cc错误 URL:http://hzwxgzh.s2.natapp.cc需要在js接口安全域名以及功能配置那里进行..._config:fail,invalid url domain

poe供电-程序员宅基地

文章浏览阅读15次。PoE技术的工作原理是在供电设备和接收设备之间进行电力传输的协商,以确保安全可靠的供电。同时,PoE技术还具有一定的电力保护功能,可以在电力超载或短路时自动停止供电,保护设备的安全。PoE供电系统的主要供电特性参数包括电压(典型值为48V)、允许最大电流(550mA)、典型工作电流(10到350mA),以及为供电设备提供的功率等级(最大不超过13W)。PoE供电(Power over Ethernet)是一种技术,它允许通过现有的以太网电缆为设备提供电力,同时该电缆也用于数据的传输。

推荐文章

热门文章

相关标签