VScode(8)之阅读大型CC++工程

VScode(8)之阅读大型CC++工程(Linux内核)代码

Author:Once Day Date:2023年4月25日/2024年3月17日

漫漫长路,有人对你微笑过嘛…

全系列文章请查看专栏: VScode开发_Once-Day的博客-CSDN博客

参考文档:

1. 历史包袱

由于上世纪70-80年代的硬件限制,C语言的编译解析是"单遍编译(one pass)",缺乏现代java,python,go等语言的模块化解析功能,这导致解析语法树需要“走一遍”上下文环境。

简单来说,如果不把include的文件走一遍,解析器无法确定各类符号的确切含义,而对于大型C/C++项目,随便include一个头文件,背后可能就有几千上万行代码,对于解析器来说,负担很大。

对于阅读大型的C/C++项目代码,需要一些辅助手段,下面是针对VScode的配置情况。

2. C和C++插件

vscode需要安装以下插件,以便提供良好的

  • C/C++ ,必备插件,。
  • c/c++ Extension Pack,扩展包。
  • c/C++ GNU Global,支持gtags。
  • GitLens,用于查看git commit记录和相关操作。
  • GitLab Workflow,用于查看代码MR和review,支持语法查询。
2. GNU Global源码标签数据库

此外Linux服务器需要安装global,这是gnu提供的一个解析代码的工具。生成二进制的数据库,对于大型代码工程非常有帮助。

  • GNU Global source code tagging system

下面是官网的介绍,传统上一般和Vim/Emacs等编辑器集成:

GNU Global is a source code tagging system that works the same way across diverse environments, such as Emacs editor, Vi editor, Less viewer, Bash shell, various web browsers, etc.

You can locate various objects, such as functions, macros, structs, classes, in your source files and move there easily. It is useful for hacking on large projects which contain many sub-directories, many #ifdef and many main() functions. It is similar to ctags or etags, but is different from them in the following two points:

  • independence of any editor
  • capability to treat definition and reference

It runs in UNIX (POSIX) compatible operating system, like GNU and BSD.

对于ubuntu系统,直接apt install global即可。其他linux系统仿照如此即可。

对于内网环境下的linux主机,需要本地编译运行,代码可在官网下载,或者下面的内网目录

/mnt/sata0/chenguang/global-6.6.9.tar.gz

复制到~家目录解压后,cd源码目录,./configure配置编译,然后make编译,最终make install即可

使用vscode连接ssh打开服务器上的内核代码文件夹。

设置配置文件(没有就新建)如下.vscode/settings.json:

{"C_Cpp.default.intelliSenseMode": "linux-gcc-x64","search.followSymlinks": false,"C_Cpp.default.browse.limitSymbolsToIncludedHeaders": true,
}

"search.followSymlinks": false很关键,大型C工程代码有些文件是符号链接文件,可能造成循环引用,这会导致cpptool直接cpu占用拉满。其他配置字段的含义,可以自行百度,网上介绍非常多。

接下来是使用global生成代码解析文件,直接在vscode里面按下F1,然后搜索global

在这里插入图片描述

第一个命令是建立数据库,执行一次即可,如果代码改变,也可以再执行一次。

这个过程会在后台一直运行,大概几分钟,等着就好。如果运行正常,目录下面会出现三个文件:

-rw-r--r--   1 ubuntu ubuntu        17M Jan  5 23:27 GPATH
-rw-r--r--   1 ubuntu ubuntu       534M Jan  5 23:27 GRTAGS
-rw-r--r--   1 ubuntu ubuntu       708M Jan  5 23:27 GTAGS

可以看到,数据是非常大的,然后就可以正常在代码使用跳转等功能了。

一般开源的大型C/C++大型项目,这三个文件已经在.gitignore里面了,所以可以忽略下面的步骤:

  1. 可以在.gitignore中添加上面上个三个文件,但是这会对.gitignore造成改动。
  2. .git/info/exclude中添加上面三个文化,这个是本地仓库屏蔽。

此外也可以使用clangd工具

  • 借助clangd实现VSCode C++代码补全 - 知乎 (zhihu.com)
3. 下面是使用实例截图

GNU Global不能支持变量解析,因此无法跳转变量,这个需要依靠cpp_tools进行解析

函数跳转

在这里插入图片描述

宏定义跳转

在这里插入图片描述

源文件函数(标识符)列表

在这里插入图片描述

结构体类型定义跳转

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【亲测可行】Mac上clion boost库的安装与使用

很多博客上关于boost库的安装与使用都有问题,所以自己写一篇文章来纠正一些错误 这里采用homebrew安装 brew install boost安装好以后boost目录在 /opt/homebrew/Cellar/boost/xxx版本 下,然后可以看到lib(库文件)和include&…

语音神经科学—04.Speech Computations of the Human Superior Temporal Gyrus

Speech Computations of the Human Superior Temporal Gyrus(人类颞上沟的言语计算) 专业术语 Superior Temporal Gyrus 颞上沟 phoneme 音素 syllable 音节 speech perception 语音感知 vocal tract 声道 acoustic 声学的 articulatory 发音的 spectro…

【基于Seeed xiao ESP32S3 Sense的自动化HA鱼缸设计】

1.前言 基于Seeed xiao ESP32S3 Sense的自动化HA鱼缸 在当今物联网与智能家居科技日益发达的时代,将先进技术和传统养鱼艺术融合,创造出智能、自动化且极具观赏价值的鱼缸已成为一种创新趋势。SeeedStudio推出的Xiao ESP32-S3 Sense开发板以其卓越的性能…

command failed: npm install --loglevel error --legacy-peer-deps

在使用vue create xxx创建vue3项目的时候报错。 解决方法,之前使用的https://registry.npm.taobao.org 证书过期更换镜像地址即可 操作如下: 1.cd ~2.执行rm .npmrc3. sudo npm install -g cnpm --registryhttp://registry.npmmirror.com…

建立人才信息化管理体系,提高企业核心竞争力

很多企业在发展中,都引入了信息化工具系统来提升管理效率。在人力资源管理方面,也有不少信息化系统。通过大量调研发现,在人才管理的初级阶段,企业通过对员工数量统计、员工结构统计、入离职、人才梯队数据、招聘管理数据、培训管…

基于高斯模型的运动目标检测(车辆检测),Matlab实现

博主简介: 专注、专一于Matlab图像处理学习、交流,matlab图像代码代做/项目合作可以联系(QQ:3249726188) 个人主页:Matlab_ImagePro-CSDN博客 原则:代码均由本人编写完成,非中介,提供…

Vue3:标签的ref属性用法

一、情景说明 我们在写前端页面的时候,肯定会遇到获取DOM内容的情况。 以往,我们是用原生的js方法去获取,如document.getXxxx 但是,这中方法会有个问题,如果父组件和子组件的id相同,则会出错。 在Vue3中&…

ASP.NET 服务器控件

目录 一、使用的软件 1、下载 2、新建文件(写一个简单的web网页) 二、相关知识点 1、Web窗体网页的组件 (1)可视化组件 (2)用户接口逻辑 2、Web Form网页的代码模型 (1)单文件…

Typecho博客网站底部添加网站已运行时间教程

样式一: 1. 将代码放入 functions.php 一般在主题根目录:网站 /usr/themes/ 主题 修改一下你自己的网站时间 // 设置时区date_default_timezone_set(Asia/Shanghai);/*** 秒转时间,格式 年 月 日 时 分 秒**/function getBuildTime() {// …

Akamai 战略转型:向全球规模化云计算,云安全,全速迈进!

全行业加速数字化转型的当下,Akamai 深入跨境电商、金融支付、游戏社交等服务场景,改善全球用户数字化生活体验的同时,凭借坚实、深厚的 CDN 技术根基与战略性并购,完成了向云计算和安全领域转型的华丽蝶变,并构建了 “…

《硬件历险》之Mac抢救出现问题的时间机器硬盘中的数据

本文虽然使用“抢救”一词,但是运气比较好,远没有达到访问和修改底层的信息来抢救的地步。如果你是需要通过访问和修改底层信息来抢救数据,建议阅读刘伟的《数据恢复技术深度揭秘(第二版)》或者寻找专业人士的帮助。 《…

视频基础知识(一) 视频编码 | H.26X 系列 | MPEG 系列 | H.265

文章目录 一、视频编码二、 H.26X 系列1、H.2612、H.2633、H.2643.1 I帧3.2 P帧3.3 B帧 4、H.265 三、 MPEG 系列1、MPEG-12、MPEG-23、MPEG-44、MPEG-7 🚀 个人简介:CSDN「博客新星」TOP 10 , C/C 领域新星创作者💟 作 者&…

面试算法-40-爬楼梯

题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1 阶 1 阶2 阶 解 class So…

一个完整的上传文件示例

一个完整的上传文件示例 需要可以看minio 我的上个文章有介绍 1、加入如下依赖 io.minio minio 8.5.2 yaml配置 minio:endpointUrl: http://127.0.0.1:9000accessKey: minioadminsecreKey: minioadminbucketName: spzx-bucketMinioProperties配置类用来通过前缀加载yaml D…

微信小程序调用百度智能云API(菜品识别)

一、注册后生成应用列表创建应用 二、找到当前所需使用的api菜品识别文档 三、点链接看实例代码 这里需要使用到如下几个参数(如下),其他的参数可以不管 client_id : 就是创建应用后的API Keyclient_secret: 就是创建…

GAN及其衍生网络中生成器和判别器常见的十大激活函数(2024最新整理)

目录 1. Sigmoid 激活函数 2. Tanh 激活函数 3. ReLU 激活函数 4. LeakyReLU 激活函数 5. ELU 激活函数 6. SELU 激活函数 7. GELU 激活函数 8. SoftPlus 激活函数 9. Swish 激活函数 10. Mish 激活函数 激活函数(activation function)的作用是对网络提取到的特征信…

鸿蒙开发实战:【Faultloggerd部件】

theme: z-blue 简介 Faultloggerd部件是OpenHarmony中C/C运行时崩溃临时日志的生成及管理模块。面向基于 Rust 开发的部件,Faultloggerd 提供了Rust Panic故障日志生成能力。系统开发者可以在预设的路径下找到故障日志,定位相关问题。 架构 Native In…

21 OpenCV 直方图均衡化

文章目录 直方图概念均衡的目的equalizeHist 均衡化算子示例 直方图概念 图像直方图,是指对整个图像像在灰度范围内的像素值(0~255)统计出现频率次数,据此生成的直方图,称为图像直方图-直方图。直方图反映了图像灰度的分布情况。 均衡的目的…

Ypay源支付2.8.8免授权聚合免签系统

本帖最后由 renleixiaoxu 于 2024-3-15 09:46 编辑 产品介绍 XPay是专为个人站长打造的聚合免签系统,拥有卓越的性能和丰富的功能。采用全新轻量化的界面UI,让您可以更加方便快捷地解决 知识付费和运营赞助的难题。同时,它基于高性能的Thin…

Unity在UGUI上通过绘制网格顶点自由画线

该插件的实现是使用UI组件的绘图API来动态生成和修改几何形状,可自由动态更改画线的粗细、拐角圆滑度、颜色,自由增减节点,不额外增加gameobject,并且在原生的UGUI上以ScreenSpace-Overlay的状态下,显示效果如下所示 …