使用VScode + clangd 阅读 c/c++ 源码环境搭建

使用Vscode + clangd 阅读c/c++源码

一、需求

在嵌入式软件开发的工作中,我们常常需要分析C/C++代码,比如linux kernel 的代码,而公司的代码一般都会存放在服务器中,服务器一般是linux,且无法联网,我们只能通过本地笔记本ssh访问服务器,这就导致阅读linux 源码时,需要跳转定义、声明时比较麻烦,本文就介绍了使用VScode + clangd 实现这个需求,同时会更新一些有效的插件帮助开发

二、实现逻辑简介

clangd 是一个应用程序,可以实现对c项目中的符号定义跳转,函数补全等功能。
Vscode 是文本编辑器,可以使用clangd 插件与服务器上的clangd 交互,实现vscode编辑器内的符号跳转等

三、环境安装

下载vscode

1、remote - ssh

安装remote - ssh 插件,并添加一个远程服务器:
连接到192.168.1.12 服务器,用户名prx,端口是22

ssh prx@192.168.1.12 -p 22

进入后需要输入密码,这样就能浏览服务器上的文件了。
注意:需要给当前用户编辑文件的权限,不然在vscode中编辑的内容无法保存到服务器,例如在kernel项目根目录下执行:

sudo chmod 777 -R .

2、安装clangd

clangd ,也可以叫clangd server,她要安装在服务器上,读取kernel 项目的代码,分析代码的编译规则等,然后等待客户端的请求。
在ubuntu 上可以用下面命令安装clangd

sudo apt-install clangd

clangd 需要输入compile_command.json文件才能开始分析kernel 的源码。要在kernel 的代码中生成compile_command.json文件,需要借助bear 应用程序,用下面命令安装bear

sudo apt-install bear

然后使用下面的命令编译kernel ,就能在kernel根目录下看到compile_command.json

sudo bear make -j8

clangd server 还需要配置文件来告诉她去那里找到compile_command.json,在kernel 项目根目录下,新建一个 .clangd 文件,编辑文件输入下面的内容:

compile_commands_dir: /home/prx/purple_pi/out/kernel/src_tmp/linux-5.10

其中** /home/prx/purple_pi/out/kernel/src_tmp/linux-5.10** 是你的kernel 代码的根目录

完成以上步骤,就可以启动clangd了,只需要执行 clangd,就会启动clangd server,读取/home/prx/purple_pi/out/kernel/src_tmp/linux-5.10compile_command.json,分析代码符号,并等待客户端请求.
在这里插入图片描述

3、安装vscode clangd 插件

启动vscode,连接到服务器,并安装clangd 插件:
在这里插入图片描述
这个clangd 插件是作为一个客户端,去和服务器上的clangd server 进行交互,发送请求等,所以她的体积并不大。安装完成后,就可以在vscode上打开kernel 的目录,随意点开一个文件,尝试跳转定义等。

4、clangd 的功能演示

代码补全:
在这里插入图片描述
查看声明和定义:
在这里插入图片描述
跳转符号的定义处:
ctrl + p 调出vscode 命令行,输入#前缀,再输入符号名称,即可跳转到定义处

#kmalloc

格式化文件
可以将c、c++、文件格式化,保证文件的语法格式健康,快捷键shift+alt+f

四、vscode插件推荐

1、hightlight-words插件

变量高亮是阅读代码中实用的功能,在vscode中安装hightlight-words 插件,可以实现该功能。
在这里插入图片描述
下面教你如何设置快捷键实现变量高亮:
打开vscode命令行输入:

>Hightlight Word Toggle Current

在下面的提示符中,选择右边的齿轮,即可设置快捷键

2、ripgrep

vscode 的搜索速度太慢了,可以使用ripgrep 应用来替换掉vscode自带的搜索功能。
ripgrep 是一个在服务器上运行的应用程序,需要先在服务器上安装(可以离线安装)
安装完成后,需要告诉vscode,在服务器上搜索文本时,使用ripgrep 作为搜索引擎:首先打开vscode命令,输入:

Preferences: Open Settings (JSON)(SSH:192.168.1.12)

打开服务器上的vscode配置文件,在其中输入下面的配置:

"search.defaultSearchProvider": "search-in-workspace",
"search.inWorkspace.useRipgrep": true,
"search.inWorkspace.additionalFileTypes": [
  "cpp",
  "c",
  "h",
  "hpp"
]

这个配置文件告诉vscode,搜索时使用ripgrep 搜索 cpp、c、h、hpp文件

五、参考文章

给服务器安装vscode插件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/29893.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

qt creator使用问题

qt creator 多版本安装需要(单独下载qtcreator安装版本),安装目录默认在Qt目录下(qt的sdk也在qt目录下) 编译过程中遇到一些很奇怪问题,建议优先重新编译。 issue qtcreator inappropriate for the inferior 构建套件&#x…

我准备蓝桥杯的这一年

我准备蓝桥杯的这一年 文章目录 我准备蓝桥杯的这一年起步和目标确定渐入佳境焦虑疲惫,一天又一天国赛我来力总结 我将我这段 流水账分为四个阶段。谨以此文,祭奠我这一年来的焦虑、白发~ ,最终也取得了预期的成绩。不知未来再看此章会作何感…

网络编程重点

1>OIS 7层模型 用户空间:应用层 7>提供各种网络接口 表示层 6>数据表示,加密与压缩 会话层 5>主机之间会话管理 内核空间:传输层 4&…

【Java基础学习打卡05】命令提示符

目录 前言一、命令提示符是什么二、命令提示符常用命令1.打开命令提示符2.命令演示3.常用命令 总结 前言 知道命令提示符是什么,熟练打开命令提示符,熟练使用常用命令,并自行尝试其他命令。本文只是对命令提示符进行简单介绍和使用。 一、命…

chatgpt赋能python:Python截取指定字符操作:让你的SEO优化变得更简单

Python截取指定字符操作:让你的SEO优化变得更简单 在SEO优化中,截取指定字符是一个非常常见的操作。Python作为一款开源的高级编程语言,提供了许多方便的函数和方法来处理文本操作,包括截取指定字符。在本文中,我们将…

在线DDL操作踩坑记录

官方地址:GitHub - github/gh-ost: GitHubs Online Schema-migration Tool for MySQL 使用ghost方式在线对mysql表进行ddl ghost原理: 要对表A进行DDL,在主库建立一个ghost表 A1在表A1上进行alter操作伪装成一个mysql的从库,监…

SpringCloud Alibaba-Sentinel

SpringCloud Alibaba-Sentinel 1. Sentinel核心库1.1 Sentinel介绍1.2 Sentinel核心功能1.2.1 流量控制1.2.2 熔断降级 2 Sentinel 限流熔断降级2.1 SentinelResource定义资源2.1.1 blockHandler/blockHandlerClass2.1.2 fallback/fallbackClass2.1.3 defaultFallback 2.2 Sent…

Java中不支持多重继承原因

在 Java 中回答这种棘手问题的关键是准备好相关主题, 以应对后续的各种可能的问题。 这是非常经典的问题,与为什么 String 在 Java 中是不可变的很类似; 这两个问题之间的相似之处在于它们主要是由 Java 创作者的设计决策使然。 为什么Java不支持类多重继承, 可以考…

ChatGPT将改变教育,而不是摧毁它

01 学校和大学的反应迅速而果断 就在 OpenAI 于 2022 年 11月下旬发布ChatGPT 的几天后,该聊天机器人被广泛谴责为一种免费的论文写作、应试工具,它很容易在作业中作弊。 美国第二大学区洛杉矶联合大学立即阻止了OpenAI网站从其学校网络访问。其他人很…

k8s的service资源类型有ClusterIP、Nodeport、ExternalName、LoadBalancer、Headless(None)

1. ClusterIP 是什么 ClusterIP 是在所有节点内生成一个虚拟IP,为一组pod提供统一的接入点,当service存在时,它的IP地址和端口不会发生改变,客户端通过service的ip和端口建立连接,由service将连接路由到该服务的任意一…

数据结构——广义表

文章目录 前言二、特殊矩阵的压缩存储数组的存储结构和实现按行优先存储按列优先存储 矩阵的压缩存储稀疏矩阵 广义表 总结 前言 数组,数组的压缩存储,广义表 二、特殊矩阵的压缩存储 数组的存储结构和实现 对于多维数组,可以分为按行优先…

spring 反射,BigDecimal,自定义注解的使用(aop)

反射 利用反射调用它类中的属性和方法时&#xff0c;无视修饰符。 获取Class类的对象&#xff08;三种方式&#xff09; Class.forName(“全类名”) &#xff08;推荐使用&#xff09;类名.class对象.getClass() 反射获取构造方法Constructor<?>[] getConstructors()…

父亲节礼物:用Python编写一个小型游戏

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python、C/C 主页链接&#xff1a;阿玥的小东东的博客_CSDN博客-python&&c高级知识,过年必备,C/C知识讲解领域博主 目录 安装必要的库 绘制游戏界面 添加游戏元素 为游戏添加交互性 结论 一、父亲节的来历简介 二…

UE4/5样条线学习(三):样条线与时间轴

目录 简单的小模板 物品跟随样条线移动 粒子特效类&#xff1a; 简单的小模板 通过之前的案例&#xff0c;我们可以直接创建一个actor蓝图&#xff0c;加上要用的样条组件&#xff1a; 然后我们就可以通过时间轴做出不同的一些效果 在蓝图中找到时间轴的这个节点 双击时间…

1745_Perl中的switch结构

全部学习汇总&#xff1a; GreyZhang/perl_basic: some perl basic learning notes. (github.com) 用了很久时间的Perl了&#xff0c;但是一直没有使用过switch结构。即使有的时候&#xff0c;基本上也通过其他的形式完成了相关工作。虽说有时候可能会效率低一些&#xff0c;但…

【备战秋招】每日一题:5月13日美团春招第三题:题面+题目思路 + C++/python/js/Go/java带注释

为了更好的阅读体检&#xff0c;为了更好的阅读体检&#xff0c;&#xff0c;可以查看我的算法学习博客第三题-火车调度 在线评测链接:P1288 题目描述 塔子哥是一位火车车厢调度员。 这一天&#xff0c;一列带有 n 个编号车厢的列车进站了&#xff0c;编号为 1\rightarrow …

【linux网络配置】多个网卡一起使用,一个网卡连内网,一个网卡连外网

一、问题背景 因为有一个工作站在内网中&#xff0c;但是没有办法联网&#xff08;校园网账户有限&#xff09;。 虽然工作站没有联网&#xff0c;但是我仍然可以通过局域网远程控制工作站&#xff0c;使其访问校园网验证页面实现上网。 当给工作站安装软件或依赖项时&#…

grpc 实现grpc gateway(window环境)

官网&#xff1a;https://grpc-ecosystem.github.io/grpc-gateway/ github&#xff1a;https://github.com/grpc-ecosystem/grpc-gateway grpc gateway的原理官网有介绍。总结一下就是&#xff1a; gRPC-Gateway帮助你同时以gRPC和RESTful风格提供你的API。grpc-gateway旨在为您…

【Linux】linux下使用命令修改jar包内某一个文件中的内容并重新运行jar程序

linux下使用命令修改jar包内某一个文件中的内容并重新运行jar程序 一、背景描述二、vi命令编辑三、启动程序四、拓展--启动脚本 一、背景描述 需求&#xff1a;发现线上的 iotp-irsb-server-v1.0.0.2.jar 包中配置文件的日志级别配置错误&#xff0c;需要在线修改jar包中文件的…

MFC的定义和实际操作方法

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天从另一个角度来看一下MFC。 完整的应用一般由四个类组成&#xff1a;CWinApp应用类&#xff0c;CFrameWnd窗口框架类&#xff0c;CDocument文档类&#xff0c;CView视类 过程&#xff1a;CWinApp创建CF…