当前位置: 首页 > web >正文

【linux驱动开发】Vscode + Remote SSH + clangd + bear=内核源码阅读环境搭建

文章目录

  • 前言
  • 一、环境说明
  • 二、环境安装
    • 1.Vscode安装Remote SSH实现远程访问
    • 2.Vscode安装clangd插件
    • 3.远程linux安装clangd
    • 4.配置Vscode中clangd插件
    • 5.远程linux安装bear
  • 三、编译环境
    • 1.Vscode创建工作区
    • 2.编译linux内核
    • 3.退出Vscode,然后远程连接,重新打开Vscode的工作区
  • 其他内容


前言

在驱动开发工程中,需要查看一些API的参数,但是使用vscode编辑器的时候,不能像source insight一样查看linux源码查看,另外自己习惯使用vscode,查看网上方法发现可以使用vscode+clangd+bear 实现内核源码快速访问,其中有些小问题这里记录供大家参考。


一、环境说明

1.vscode运行在Windows环境
2.Linux虚拟机是在Windows环境下通过VMWare安装,版本为Ubuntu20.04

二、环境安装

1.Vscode安装Remote SSH实现远程访问

vscode安装Remote SSH实现远程访问linux服务器
参考链接1
参考连接2

2.Vscode安装clangd插件

注意:确保在第一步已经使用Remote SSH远程连接到linux服务器在进行下面这步
在vscode的插件搜索栏clangd插件,安装到远程linux中【192.168.198.128】,可以在插件栏看到是否安装到linux中,并且将C/C++插件给卸载掉,否则会冲突

3.远程linux安装clangd

方法1:网上的其他方法是,在第2步vscode安装好clangd插件之后,vscode会自动在linux端安装clangd服务【但是这个过程很慢,除非科学上网】
方法2:去github拉取clangd文件,拷贝到linux中解压【这个方法由于公司电脑原因,不能使用】
方法3:直接在linux上输入安装指令:sudo apt-get install clangd或者sudo apt install clangd【下图是clangd官方给出的方法,安装的是clangd-12版本,这里我实测可以直接安装clangd,不用指定版本】
在这里插入图片描述

检查linux上clangd是否安装成功,如下输入:
clangd --version查看版本

lubancat@ubuntu:~/code/lubancat_kernel$ clangd --version
clangd version 10.0.0-4ubuntu1 

which clangd查看路径

lubancat@ubuntu:~/code/lubancat_kernel$ which clangd
/usr/bin/clangd

4.配置Vscode中clangd插件

配置1clangd插件的设置【注意这里要切到远程linux下面设置】
在这里插入图片描述
首先在clangd.arguments输入【注意,下面的内容一条一条的添加,之前测试是一次性复制输入,发现不行】

--compile-commands-dir=${workspaceFolder}
--background-index
--completion-style=detailed
--header-insertion=never
-log=info

然后在clangd.path输入【这里根据自己的路径】

/usr/bin/clangd

5.远程linux安装bear

在linux端直接输入:sudo apt-get install bear libear ,这里如果输入sudo apt-get install bear会报错
检查linux上bear是否安装成功,如下输入:
bear --version查看版本

lubancat@ubuntu:~/code/lubancat_kernel$ bear --version
bear 2.4.3

which bear查看路径

lubancat@ubuntu:~/code/lubancat_kernel$ which bear
/usr/bin/bear

三、编译环境

1.Vscode创建工作区

使用vscode将linux内核源码和驱动源码放在俩个文件夹下,把这俩个文件夹放在一个工作区,方法在编写驱动程序的时候,可以直接访问linux源码。工作区包含的文件夹如下

1.lubancat_kerner #用来存放linux内核
2.linux_driver    #用来存放驱动源码

2.编译linux内核

make clean
bear make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- lubancat2_defconfig
bear make ARCH=arm64 -j4 CROSS_COMPILE=aarch64-linux-gnu-

①等待编译完成【时间有点长,可以喝杯茶】,完毕之后会在linux源码的根目录路径下多出一个compile_commands.json文件,这个文件应该很多行【如果很小,说明编译有问题,按照上面清除之后重新编译】。
②编译完成后,这里我遇到一个问题在vscode的输出终端哪里一直报错
解决方法1clangd不能跳转,并报failed: Couldn’t build compiler instance错误
解决方法2 clangd:Couldn‘t build compiler instance
在这里插入图片描述

③这里前人的解决方法是,创建一个.clangd文件输入配置信息,但是我试了下发现不太行,而且还要重新编译linux内核【还在等很久实在受不了】
解决方法3——我的方法想了下这里不就是把compile_commands.json这个文件中的-mabi=lp64去掉吗,于是直接在compile_commands.json文件中按下ctrl+F搜索-mabi=lp64,然后用空白内容替换不就行了,直接简单暴力】

3.退出Vscode,然后远程连接,重新打开Vscode的工作区

工作区存放的文件夹如下:

1.lubancat_kernel【这是我放linux内核源码的目录】
2.linux_driver【这是我放驱动源码的目录】

然后,在linux内核源码和驱动源码中的头文件、函数、变量就可以直接使用ctrl+鼠标左键进行跳转,这样简直泰裤啦!!!

其他内容

1. bear 的作用
核心功能
生成 compile_commands.json 文件(编译数据库),记录项目编译时的所有命令、参数和文件路径。为什么需要它?
C/C++ 项目通常通过 Makefile、CMake 等构建系统编译,IDE 无法直接获知每个文件的编译规则。compile_commands.json 明确告诉工具(如 clangd)如何解析每个源文件(包括头文件路径、宏定义等)。
2. clangd 的作用
核心功能
C/C++ 语言服务器(Language Server Protocol, LSP),为编辑器(如 VSCode、Vim)提供:代码补全、跳转到定义、实时错误检查、代码重构、文档悬停提示为什么需要它?
传统的 C/C++ 插件(如 VSCode 的 C/C++ 插件)基于文本匹配,分析能力有限。clangd 基于 LLVM/Clang,能像编译器一样精准理解代码语义。依赖条件
需要 compile_commands.json(由 bear 生成)来正确解析项目代码。
http://www.xdnf.cn/news/16854.html

相关文章:

  • 三维开放场景图助力机器人自主导航!Point2Graph:点云驱动的三维开放词汇场景图端到端机器人导航
  • 蓝牙设备配对:从机发现主机全过程
  • 《质光相济:Three.js中3D视觉的底层交互逻辑》
  • 嵌入式仿真教学的革新力量:深圳航天科技创新研究院引领高效学习新时代
  • 学习笔记《区块链技术与应用》第三天 网络 难度
  • 【01】大恒相机SDK C++开发 —— 初始化相机,采集第一帧图像、回调采集、关闭相机
  • TGD第九篇:三维应用——视频边缘检测
  • Excel 知识点汇总
  • 爱普生002墨水与004墨水基本参数及支持机型
  • 行业热点丨仿真历史数据难以使用?如何利用几何深度学习破局,加速汽车工程创新
  • Java 17 新特性解析与代码示例
  • Linux的库制作与原理
  • Haproxy调度算法 - 静态算法介绍与使用
  • 为什么Android主线程与java主线程不同,不会退出?
  • 全栈:怎么把IDEA和Maven集成一下?
  • 前端框架Vue3(四)——组件通信及其他API
  • 分布内侧内嗅皮层的层Ⅱ或层Ⅲ的网格细胞(grid cells)对NLP中的深层语义分析的积极影响和启示
  • 一万字讲解Java中的IO流——包含底层原理
  • QtConcurrent::run函数
  • Nginx反向代理负载均衡
  • 常用设计模式系列(十六)—策略模式
  • Ubuntu 24.04 LTS 保姆级教程:安装 NVIDIA 显卡驱动、CUDA 12.5 及 Docker 容器工具包
  • 【YOLOv1】
  • 云服务器数据库
  • 【龙泽科技】汽车维护与底盘拆装检修仿真教学软件【风光580】
  • 机器学习①【机器学习的定义以及核心思想、数据集:机器学习的“燃料”(组成和获取)】
  • [Broken IOS] 配置CLI | 终端用户界面TUI
  • sqli-labs:Less-12关卡详细解析
  • C++异常处理的成本:理解与优化
  • Golang 调试技巧:在 Goland 中查看 Beego 控制器接收的前端字段参数