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进行解析

函数跳转

在这里插入图片描述

宏定义跳转

在这里插入图片描述

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

在这里插入图片描述

结构体类型定义跳转

在这里插入图片描述

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

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

相关文章

综合知识篇08-数据库系统考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例…

Ubuntu 16.04 设置 root 密码

Ubuntu 16.04 设置 root 密码 1. sudo2. parserReferences 1. sudo sudo (/ˈsuːduː/ or /ˈsuːdoʊ/) is a program for Unix-like computer operating systems that allows users to run programs with the security privileges of another user, by default the superus…

【系统性】 循序渐进学C++

循序渐进学C 第一阶段&#xff1a;基础 一、环境配置 1.1.第一个程序&#xff08;基本格式&#xff09; ​ #include <iosteam> using namespace std;int main(){cout<<"hello world"<<endl;system("pause"); }​ 模板 #include &…

论文阅读——RSGPT

RSGPT: A Remote Sensing Vision Language Model and Benchmark 贡献&#xff1a;构建了一个高质量的遥感图像描述数据集&#xff08;RSICap&#xff09;和一个名为RSIEval的基准评估数据集&#xff0c;并在新创建的RSICap数据集上开发了基于微调InstructBLIP的遥感生成预训练…

ElasticSearch架构设计

一、基础概念 Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单&#xff0c;它不仅包括了全文搜索功能&#xff0c;还可以进行以下工作: 一个分布式的实时文档…

AI基础知识(2)--决策树,神经网络

1.什么是决策树&#xff1f; 决策树是一类常见的机器学习方法&#xff0c;决策树是基于树的结构来进行决策。决策过程中提出的每一个问题都是对于属性的“测试”&#xff0c;决策的最终结论对应了我们希望的判定结果。一个决策树包含一个根节点&#xff0c;若干个内部节点和若…

MyBatisPlus——Wrapper

Wrapper体系 QueryWrapper 使用字符串表示列名&#xff0c;通过字符串拼接的方式构建查询条件 再将 wrapper 作为条件参数&#xff0c;写入BaseMapper提供的查找方法中&#xff08;或其他数据库方法&#xff09; QueryWrapper<QueryEntity> wrapper new QueryWrapper&l…

Python笔记|字符串合并、切片、索引

一、合并 字符串可以用 合并&#xff08;粘到一起&#xff09;&#xff0c;也可以用 * 重复&#xff1a; >>> 3 * un ium unununium 相邻的两个或多个字符串字面值&#xff08;引号标注的字符&#xff09;会自动合并&#xff1a; >>> Py thon Python …

【鸿蒙HarmonyOS开发笔记】自定义组件详解

自定义组件 除去系统预置的组件外&#xff0c;ArkTS 还支持自定义组件。使用自定义组件&#xff0c;可使代码的结构更加清晰&#xff0c;并且能提高代码的复用性。 我们开发的每个页面其实都可以视为自定义组件内置组件的结合 语法说明 自定义组件的语法如下图所示 各部分…

STM32的简单介绍

STM32是一种基于ARM Cortex-M内核的32位微控制器&#xff0c;由意法半导体公司开发和生产。STM32具有丰富的外设和功能&#xff0c;适用于各种应用场合&#xff0c;如工业控制、消费电子、物联网、人机交互等。STM32的优势包括低功耗、高性能、高可靠性、易于开发等。STM32的系…

R语言深度学习-6-模型优化与调试

本教程参考《RDeepLearningEssential》 这是本专栏的最后一篇文章&#xff0c;一路走来&#xff0c;大家应该都可以独立的建立一个自己的神经网络进行特征学习和预测了吧&#xff01; 6.1 缺失值处理 在我们使用大量数据进行建模的时候&#xff0c;缺失值对模型表现的影响非常…

windows安装go

一、go安装包下载 Go官网下载地址&#xff1a;https://golang.org/dl/ Go官方镜像站&#xff08;推荐&#xff09;&#xff1a;https://golang.google.cn/dl/ 选择windows 二、双击安装并配置环境变量 windows7、10或11配置环境变量-CSDN博客 三、测试是否安装成功 打开c…

git问题列表(一)(持续更新中~~~)

文章目录 问题1&#xff1a;如何在本地创建git仓库&#xff0c;并推送到远程仓库&#xff1f;问题2&#xff1a;如何创建本地分支&#xff0c;并基于其创建远程分支&#xff1f;问题3&#xff1a;报错“origin does not appear to be a git repository”是什么原因&#xff1f;…

Unity触发器的使用

1.首先建立两个静态精灵&#xff08;并给其中一个物体添加"jj"标签&#xff09; 2.添加触发器 3.给其中一个物体添加刚体组件&#xff08;如果这里是静态的碰撞的时候将不会触发效果&#xff0c;如果另一个物体有刚体可以将它移除&#xff0c;或者将它的刚体属性设置…

The Rise and Potential of Large Language Model Based Agents: A Survey

OpenAI AI的应用研究主管Lilian Weng发布了关于AI Agents的《大语言模型&#xff08;LLM&#xff09;支持的自主代理》&#xff0c;在文章中她定义了基于LLM构建AI Agents的应用框架&#xff1a;AgentLLM&#xff08;大型语言模型&#xff09;记忆&#xff08;Memory&#xff0…

Tomcat Seeion 集群

部署&#xff1a;nginx服务器&#xff1a;11-11&#xff1b;tomcat1:11-3; tomcat2:11-6 nginx服务器11-11做搭建&#xff1a; [rootmcb-11 ~]# systemctl stop firewalld [rootmcb-11 ~]# setenforce 0 [rootmcb-11 ~]# yum install epel-release.noarch -y [rootmcb…

【Linux】对进程PCB的理解查看进程信息的方法

一、学习准备&#xff1a;对操作系统工作模式的理解 首先我们要清楚的是&#xff0c;操作系统是一个进行软硬件资源管理的软件。操作系统对下要管理好底层硬件。每一个硬件的生产产商都会给他们的产品提供对应的驱动程序&#xff0c;驱动程序是特定于某一硬件或系统设备的软件组…

Oracle P6 Professional 配置连接数据库总结

前言 P6 Professional作为Oracle P6计划管理系统的重要套件之一&#xff0c;其操作出色&#xff0c;体检佳&#xff0c;是非常多的计划工程师跟踪项目进度计划的辅助工具。自20年前&#xff0c;Professional一直在不断的演变更新&#xff0c;以适应当前的新技术&#xff0c;从…

Coursera上Golang专项课程2:Functions, Methods, and Interfaces in Go 学习笔记

Functions, Methods, and Interfaces in Go Course Certificate 本文是学习 Functions, Methods, and Interfaces in Go 这门课的学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 Functions, Methods, and Interfaces in GoMODULE 1: FUNCTIONS AND ORGANIZ…

Selenium-webdriver_manager判断是否已经下载过驱动(复用缓存驱动)

1,谷歌浏览器默认位置 2&#xff0c;ChromeDriverManager 下载的驱动位置 其中admin为机器的用户名 def installDriver(self):"""判断是否需要下载driver""""""找到本机谷歌浏览器版本""""""C:\P…