Linux中常见开发工具简单介绍
目录
apt/yum
介绍
常用命令
install
remove
list
vim
介绍
常用模式
命令模式
插入模式
批量操作
底行模式
模式替换图
vim的配置文件
gcc/g++
介绍
处理过程
预处理
编译
汇编
链接
库
静态库
动态库(共享库)
make/Makefile
介绍
Makefile
Git
介绍
Git使用
git clone
git status
git log
git add
git commit
git push
git pull
gdb/cgdb
介绍
使用
apt/yum
介绍
apt和yum都是软件包管理器,apt是Ubuntu的,yum是CentOs的。它可以主动帮我们解决包的依赖问题。它是通过内置链接来实现下载软件包的。
软件包管理器就相当于是手机上的应用商店,而软件包就类似于App。
常用命令
install
安装软件包,yum/apt install 软件包名,在软件包名前加 -y 会不在询问我们是否执行该操作,而是直接执行(下面也一样)。注意:普通用户要下软件要用sudo。
sl是一个有趣的命令,它会生成一个小火车:
remove
删除软件包,yum/apt remove 软件包名。
当删除后可以用--version来查看是否存在。
list
查找软件包,yum/apt list 软件包名,软件包有很多如果直接找的话,工作量会很大,可以利用grep来查找。
vim
介绍
vim是一个文本编辑器,vim是多模式的编辑器,其中常用的有命令模式,插入模式,底行模式。当我们打开vim时默认是命令模式。
进入vim只需要vim 普通文件名即可。在打开vim时可以用:vim 文件名 +n,即可直接让光标在第n行。如果没有普通文件名会先创建一个然后在进入。
常用模式
命令模式
该模式可以使用各种命令来对文本进行操作。
下面是命令模式中光标移动的常用命令:
- gg:定位到开头
- G:定位到结尾
- nG:定位到第n行
- ^:定位到行头
- $:定位到行尾
- h:向左移动,相当于←
- j: 向下移动,相当于↓
- k:向上移动,相当于↑
- l: 向右移动,相当于→
- w:以单词为单位向后移动
- b:以单词为单位向前移动
补充:6,7,8,9,10前均可加n,表示一次移动n行。
10、11演示:
现在光标在p处按一次w会到
,如果这时按b回到p处
,如果是2w就是移动两个单词,所以会到h处
下面是命令模式中其它的常用命令:
- yy:复制当前行
- p:光标所在位置进行粘贴
- dd:剪切或删除当前行
- x:删除光标右边的内容
- X:删除光标左边的内容
- r:替换光标所在位置字符
- R:批量化替换
- ~:光标所在位置字母的大小写替换
- u:撤销历史操作
- ctrl + r:反撤销
补充:1,2,3,4,5,6前均可加n,前三个表示一次操作n行,后面的表示一次操作n个长度。7会直接进入替换模式,替换模式简单来说就是你在键盘上按的键都会替换光标所在位置字符,替换一个光标默认向后移动。Esc即可退出返回到命令模式。
下面是命令模式中查找的常用命令:
- #:自动选择光标所在位置单词
- n:从下向上找
比如说现在有三个printf函数,
当你输入#后如下:
输入n会向上查找
插入模式
该模式是用于输入和修改文本内容的模式。输入i进入该模式,Esc退出该模式并返回到命令模式。
批量操作
在命令模式中用Ctrl + v进入V-BLOCK模式,然后用h、j、k、l选取范围,然后输入I进入插入模式,然后把范围的第一行写入要操作的内容,最后点Esc返回命令模式即可实现批量操作。
先用Ctrl + v进入V-BLOCK模式,在左下角会有模式名字
然后用h、j、k、l选取范围
然后输入I进入插入模式
然后输入要批量操作的内容
最后Esc返回命令模式,即可将剩余的选取范围都给操作掉
批量删除就和上面差不多,只是到选完区域后,按d键即可,并且会回到命令模式。
底行模式
该模式用于执行一些需要输入命令或参数的操作。输入 : 进入该模式,Esc退出该模式并返回到命令模式。
下面是底行模式的常用命令:
- wq!:强制保存退出(w保存,q退出,!强制)
- ! 命令:执行外部命令(在shell外壳中,!加指令的首字母将会自动执行最近的一次以该字母开头的指令)
- %s/old/new:把文件里的old都给替换成new
- / 单词:在文件里正向查找该单词
- ? 单词:在文件里反向查找该单词
- vs 文件名:新建或打开该文件,用Ctrl + ww切换不同文件
2演示:
在vim中:
在shell外壳中:
3演示:
6演示:
因为我的目录里没有tt.c所以会新建一个tt.c,光标默认在tt.c里。
如果想把光标给移到test.c里就要用到ctrl + ww
可以看到光标确实到了test.c里了。
模式替换图
vim的配置文件
vim的配置需要有.vimrc,如果没有就需要我们自己提供一个,他是给vim提供各种配件的例如:设置行号、自动补全等。大家可以自己去网上查查。
gcc/g++
介绍
gcc/g++是编译器,gcc用于编译C语言,g++用于编译C++。
处理过程
预处理
本质上是修改我们的代码比如:删注释,宏替换,头文件展开等。
可以用下面的指令来实现生成预处理之后的文件:
gcc -E test.c -o test.i。其中-E是告诉编译器预处理完之后停下来,-o 选项用于指定输出文件的名称。如果没有-o test.i它会默认生成一个与源文件名字相同后缀不同的文件。
编译
经过编译之后会将代码变成汇编代码,之所以变汇编代码是因为语言发展的历史原因决定的,是先有汇编再有其他的高级语言。
gcc -S test.i -o test.s。-S是告诉编译器编译完之后停下来。
汇编
经过汇编之后会生成目标文件里面的内容是二进制,但是这时的二进制文件还不能直接执行。
gcc -c test.s -o test.o。-c是告诉编译器汇编完之后停下来。Linux中的目标文件后缀是.o,Windows是.obj。
链接
把.o文件给链接起来,并让程序在库中找到对应方法的地址,最终生成可执行文件。
最后./code即可运行程序。
大多数情况下不会像上面一样而是首先生成目标文件,然后再统一链接,这么做可以提高编译效率并且提高文件复用。
库
库里面的文件一般也都是目标文件,库分为静态库和动态库。
静态库
后缀在Linux下是.a,Windows下是.lib。直接在库里拷贝一份到你的程序里,但体积大,浪费资源。
动态库(共享库)
后缀在Linux下是.so,Windows下是.dll。需要跳转到库里去执行(通过在链接中找到的地址),库一旦缺失就会使程序无法运行,体积小,库里面的函数只会在内存中出现一次。
make/Makefile
介绍
make是自动化构建工具。它通过读取特定的配置文件(Makefile,M/m均可),根据其中定义的规则来自动执行相应命令,从而实现对软件项目的自动化构建。
Makefile是一个文本文件,用于告知make工具如何构建项目。它包含一系列规则,明确了目标文件、这些目标文件依赖文件以及生成目标文件所依赖的命令。
Makefile
Makefile文件默认是没有的,需要我们在当前目录自己提供一个,下面是规则格式:
目标文件:依赖文件(依赖关系)
依赖方法
依赖方法前面要加一个TAB键!
要构建项目时只需要make目标文件,如果目标文件是Makefile的第一个目标文件那就可以不写目标文件。
.PHONY是用于定义伪目标。具体如下:
被它修饰的目标文件可以多次make,因为make之后如果依赖文件没有修改就不会重新编译。它只会对修改的文件做重新编译并不会全部编译。
可以看到多次make并没有什么问题,那要是code呢?
可以看到给出了提醒
判断是否修改是通过查看文件的Modify的时间(记录内容修改时的时间)来确定的,如果.c的M要新于.exe的M那就会进行重新编译。补充:文件的时间属性还有Access和Change其中Access是记录查看文件的时间(到达一定的次数才会改变),Change是记录文件属性修改的时间(它和Modify几乎是同时改变的,因为内容的修改就会改变大小,时间等)。可以通过stat来查看文件的属性。
在Makefile里可以定义变量类似于宏,$(变量名)类似于解引用。
大家可能发现了上面的红框里这是自动打印的依赖方法,可以用@隐藏。
$@:表示目标文件,$^:表示依赖文件列表。
%.o:%.c,它是一种规则模式,它表示所有的.o文件都可以通过.c文件来生成,本质上就是一个一个展开,%类似于通配符。
$< 是一个自动变量,它代表规则中的第一个依赖文件。例如,在规则 code.o: test.c tt.h中, $< 就代表 test.c 。
当前目录所有源文件可以用SRC=$(shell ls *.c)或者SRC=$(wildcard *.c)来拿到。定义目标文件可以OBJ=$(SRC:.c=.o)这是一种变量替换语法。它的作用仅仅是生成一个目标文件列表,#是注释。
总体浏览:
通过上面的操作我们就可以了很方便的构建项目,虽然现在看不出来但要是等文件多起来的时候就会变得巨方便。
Git
介绍
Git是版本控制器,它用来进行版本控制,简单来说,就是对项目中的文件、代码等内容的变更进行记录、管理和追踪的系统。同时支持多个开发者进行协作开发项目。
使用Git可以将代码存在本地或远端,Git允许从远端推送到本地,从本地拉取到远端。一般将代码上传到远端仓库,这样可以方便团队协作,仓库其实就是一个文件夹。像gitee和github就是基于git开发的网站或平台(远端)。
Git还是去中心化,分布式的版本控制,即没有中心控制节点,系统中各节点地位平等,数据、任务或功能分散在多个不同节点上。
Git使用
git clone
后面接远端仓库链接,用于克隆(复制)远程仓库到本地的,会新增一个文件该文件叫工作区也是本地仓库,进入该工作区用ll会看到.git这就是实际仓库。
在我的目录里,linux-learning就是我的工作区。
git status
用于查看Git中用于查看当前工作目录和暂存区状态的命令。
git log
用于查看提交历史记录。
git add
后接要上传的文件,这里只是将文件放在了暂存区,这些文件的修改就会被Git跟踪,等待后续使用git commit命令提交到本地仓库的版本历史中。
注意:Git只会记录修改部分的变化!
git commit
后接 -m "",双引号里的内容一定要是有意义的。之后暂存区的文件就会被上传到本地仓库里。
git push
将本地的文件上传到远端仓库。
可以看到确实在远端仓库确实多了一次提交
git pull
当远端仓库的文件跟本地不同步时才要pull的,用于将远端仓库的文件拉取到本地仓库,也就是同步远端仓库。当同步后在add、commit、push。
gdb/cgdb
介绍
gdb是调试工具,主要用于调试C、C++等编程语言编写的程序。cgdb是一款基于gdb的图形化调试工具,为开发者提供了更直观、高效的调试体验。
安装cgdb
Ubuntu:apt-get install -y cgdb
Centos:yum install -y cgdb
在Linux中用gcc/g++编译好的程序,无法直接调试,因为默认的工作模式是release,要在编译时gcc/g++后加-g(相当于是添加调试信息)才是debug模式。gdb/cgdb后要接可执行文件。
使用
下面是常用命令:
- l:查看源代码,后面可以接行号,表示要查看第几行的源码
- b:打断点,有三种打法:1.b 文件名:行号、2.b 文件名:函数、3.b 行号
- info b:查看断点信息
- d:删除断点,后面只能接断点编号不能接行号,只要你不退出cgdb,编号会一直向后线性递增
- r:从头运行程序或到下个断点,即使程序结束在输入r之后会再次从头开始运行程序至遇到断点或结束程序。
- n:逐过程,不进函数里
- s:逐语句,进函数里
- quit:退出调试器
- bt:查看栈帧
- finish:直接执行到函数结束(return语句之后)
- p:后可以接变量或表达式,用于查看值
- disable:后接断点序号,用于忽略断点
- enable:后接断点序号,用于启动断点
- c:从该断点运行到下个断点
- until:后接行号,用于跳过循环到指定行号(并非跳过而是执行完循环)
- display:后接变量,用于监视变量
- undisplay:后监视变量序号,用于取消监视变量
- info locals:查看函数里所有临时变量
- watch:后接变量,当该变量改变时会告诉你
- set var:后接变量=值,给变量赋值
- 条件断点:即满足某一条件时才会被执行。1.新增断点:b 行号 if 判断语句、 2.对已有断点添加条件:condition 编号 判断语句
使用cgdb时输入Esc到代码处可以上下翻动,输入i回到原来的地方。
10演示:
当我输入后:
15演示:
当我输入后:
上面我所介绍的开发工具一定要自己上手练习!!!
相关文章:

Linux中常见开发工具简单介绍
目录 apt/yum 介绍 常用命令 install remove list vim 介绍 常用模式 命令模式 插入模式 批量操作 底行模式 模式替换图 vim的配置文件 gcc/g 介绍 处理过程 预处理 编译 汇编 链接 库 静态库 动态库(共享库) make/Makefile …...
laravel 使用异步队列,context带的上下文造成反序列化出问题
2025年5月8日17:03:44 如果你是单个应用,异步递交任务,是在应用内部使用,一般不会发生这样的问题 但是现在app项目是 app是一个应用,admin是一个应用,app吧为了接口性能吧异步任务丢给admin去执行,如果两个…...

flow-matching 之学习matcha-tts cosyvoice
文章目录 matcha 实现cosyvoice 实现chunk_fmchunk_maskcache_attn stream token2wav 关于flow-matching 很好的原理性解释文章, 值得仔细读,多读几遍,关于文章Flow Straight and Fast: Learning to Generate and Transfer Data with Rectifi…...
视频编解码学习三之显示器续
一、现在主流的显示器是LCD显示器吗? 是的,现在主流的显示器仍然是 LCD(液晶显示器,Liquid Crystal Display),但它已经细分为多种技术类型,并和其他显示技术(如OLED)形成…...

ubuntu22.04在 Docker容器中安装 ROS2-Humble
22.04 安装 docker 容器并实现rviz功能 1 docker pull命令拉取包含ROS-Humble的镜像: docker pull osrf/ros:humble-desktop-full-jammy docker images验证该镜像是否拉取成功。 使用镜像osrf/ros:humble-desktop-full-jammy创建并运行容器 sudo docker run -it…...

【JavaWeb+后端常用部件】
回顾内容看: 一、获取请求参数的方法 参考:[JavaWeb]——获取请求参数的方式(全面!!!)_java 获取请求参数-CSDN博客 Json格式的Body加备注RequestBody{id}动态路径加备注PathVariableid?&name?直接接收就好 i…...

Redis 重回开源怀抱:开源精神的回归与未来展望
在开源软件的广袤天地里,Redis 一直是备受瞩目的明星项目。近期,Redis 宣布重新回归开源,这一消息犹如一颗石子投入平静的湖面,在技术社区激起层层涟漪。今天,就让我们深入了解 Redis 这一重大转变背后的故事、意义以及…...

弹窗表单的使用,基于element-ui二次封装
el-dialog-form 介绍 基于element-ui封装的弹窗式表单组件 示例 git地址 https://gitee.com/chenfency/el-dialog-form.git 更新日志 2021-8-12 版本1.0.0 2021-8-17 优化组件,兼容element原组件所有Attributes及Events 2021-9-9 新增tip提示 安装教程 npm install …...
Unity打包安卓失败 Build failure 解决方法
【Unity】打包安卓失败 Build failure 的解决方法_com.android.build.gradle.internal.res.linkapplicat-CSDN博客 unity在打包时设置手机屏幕横屏竖屏的方法_unity打包默认横屏-CSDN博客...
Flink + Kafka 数据血缘追踪与审计机制实战
一、引言 在实时数据系统中,“我的数据从哪来?去往何处?” 是业务方最关心的问题之一。 尤其在以下场景下: 📉 金融风控:模型出现预警,需回溯数据源链路。 🧾 合规审计:监管要求提供数据全流程路径。 🛠 运维排查:Kafka Topic 数据乱序或错发后快速定位来源。 …...

实践005-Gitlab CICD全项目整合
文章目录 环境准备环境准备集成Kubernetes Gitlab CICD项目整合项目整合整合设计 后端Java项目部署后端Java项目静态检查后端Java项目镜像构建创建Java项目部署文件创建完整流水线 前端webui项目部署前端webui项目镜像构建创建webui项目部署文件创建完整流水线 构建父子类型流水…...

懒人美食帮SpringBoot订餐系统开发实现
概述 快速构建一个订餐系统,今天,我们将通过”懒人美食帮”这个基于SpringBoot的订餐系统项目,为大家详细解析从用户登录到多角色权限管理的完整实现方案。本教程特别适合想要学习企业级应用开发的初学者。 主要内容 1. 用户系统设计与实现…...
css animation 动画属性
animation // 要绑定的关键帧规则名称 animation-name: slidein;// 定义动画完成一个周期所需的时间,秒或毫秒 animation-duration: 3s;// 定义动画速度曲线 animation-timing-function: ease;// 定义动画开始前的延迟时间 animation-delay: 1s;// 定义动画播放次数…...

MySQL 从入门到精通(六):视图全面详解 —— 虚拟表的灵活运用
在数据库开发中,我们经常需要重复执行复杂的多表查询,或是需要限制用户只能访问特定数据。这时候,MySQL 的 视图(View)就能大显身手。作为一种 “虚拟表”,视图不存储实际数据,却能基于 SQL 查询…...

手机隐私数据彻底删除工具:回收或弃用手机前防数据恢复
软件介绍 有这样一款由吾爱网友chenwangjun 原创开发的数据处理软件,名为 AndroidDiskClear。它的核心功能十分强大,能够将你手机里已经删除的各类文件,像图片、普通文件、文字信息等彻底清除干净,有效杜绝数据恢复类软件的二次恢…...

数据压缩实现案例
在driver中修改代码 package com.root.mapreduce.compress; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.…...
python实战项目69:基于Python爬虫的链家二手房数据采集方法研究
python实战项目69:链家二手房数据采集 一、项目需求1.1 房地产数据价值1.2 传统数据获取局限性1.3 技术可行性二、数据采集流程2.1 需求分析2.2 网页结构分析2.3 请求发送与反爬策略2.4 数据解析2.5 数据存储三、结论与展望四、完整代码一、项目需求 本文针对房地产数据分析需…...
xml与注解的区别
功能xml配置注解定义bean bean标签 id属性 class属性 Component Controller Service Repository ComponentScan 设置依赖注入 setter注入(set方法) 构造器注入(构造方法) Autowired Qualifier Value 配置第三方bean bean标签 静…...

FlySecAgent:——MCP全自动AI Agent的实战利器
最近,出于对人工智能在网络安全领域应用潜力的浓厚兴趣,我利用闲暇时间进行了深入研究,并成功开发了一款小型轻量化的AI Agent安全客户端FlySecAgent。 什么是 FlySecAgent? 这是一个基于大语言模型和MCP(Model-Contr…...
利用flask设计接口
Flask 接口设计详尽指南(整合知识库优化版) 目录 基础概念与安装接口设计规范核心功能实现高级特性扩展错误处理与调试部署与优化完整示例 基础概念与安装 安装 Flask pip install Flask项目结构建议 my_flask_api/ ├── app.py # 主…...

ideal创建Springboot项目(Maven,yml)
以下是使用 IntelliJ IDEA 创建基于 Maven 的 Spring Boot 项目并使用 YAML 配置文件的详细步骤: 一、创建 Spring Boot 项目 启动项目创建向导 打开 IntelliJ IDEA,点击“File”->“New”->“Project”。 在弹出的“New Project”窗口中&#…...

Pycharm(十九)深度学习
一、深度学习概述 1.1 什么是深度学习 深度学习是机器学习中的一种特殊方法,它使用称为神经网络的复杂结构,特别是“深层”的神经网络,来学习和做出预测。深度学习特别适合处理大规模和高维度的数据,如图像、声音和文本。深度学习、机器学习和人工智能之间的关系如下图所…...
XSS 攻击:深入剖析“暗藏在网页中的脚本“与防御之道
XSS (Cross-Site Scripting),即跨站脚本攻击,是 Web 安全领域中最常见也最具危害性的漏洞之一。攻击者通过巧妙的手段将恶意的 JavaScript、HTML 或其他脚本代码注入到正常的 Web 页面中。当其他用户浏览这些被注入了恶意脚本的页面时,这些脚…...

Scrapyd 详解:分布式爬虫部署与管理利器
Scrapyd 是 Scrapy 官方提供的爬虫部署与管理平台,支持分布式爬虫部署、定时任务调度、远程管理爬虫等功能。本文将深入讲解 Scrapyd 的核心功能、安装配置、爬虫部署流程、API 接口使用,以及如何结合 Scrapy-Redis 实现分布式爬虫管理。通过本文&#x…...
ai之pdf解析rapidOCR 的两种底层依赖PaddlePaddle 和ONNXRuntime
rapidocr_onnxruntime 与 rapidocr(通常指 rapidocr_paddle 或其他后端实现)的核心区别及使用推荐: 一、核心区别 特性rapidocr_onnxruntimerapidocr(以 rapidocr_paddle 为例)后端引擎基于 ONNXRuntime 推理框架&…...

驱动开发硬核特训 · 专题篇:Vivante GPU 与 DRM 图形显示体系全解析(i.MX8MP 平台实战)
视频教程请关注 B 站:“嵌入式Jerry”。 一、背景导读:GPU 与 DRM 到底谁负责“显示”? 在嵌入式 Linux 图形系统中,“画面怎么显示出来”的问题,表面看似简单,实则涉及多个内核子系统与用户态组件的协同&…...

C——猜数字游戏
前面我们已经学习了C语言常见概念,数据类型和变量以及分置于循环的内容,现在我们可以将这些内容结合起来写一个有趣的小游戏。下面正式开始我们今天的主题——猜数字游戏的实现。 猜数字游戏的要求: 1.电脑自动生成1~100的随机数。 2.玩家…...

C/C++实践(三)深入理解 C++ 三大特性之一:封装
一、封装的概念与核心思想 封装(Encencapsulation)是 C 面向对象编程(OOP)的三大核心特性之一,其本质是将数据(成员变量)和对数据的操作(成员函数)捆绑在一个逻辑单元&a…...
Filecoin存储管理:如何停止Lotus向特定存储路径写入新扇区数据
Filecoin存储管理:如何停止Lotus向特定存储路径写入新扇区数据 引言背景问题场景解决方案步骤1:修改sectorstore.json文件步骤2:重新加载存储配置步骤3:验证更改 技术原理替代方案最佳实践结论 引言 在Filecoin挖矿过程中&#x…...

1、RocketMQ 核心架构拆解
1. 为什么要使用消息队列? 消息队列(MQ)是分布式系统中不可或缺的中间件,主要解决系统间的解耦、异步和削峰填谷问题。 解耦:生产者和消费者通过消息队列通信,彼此无需直接依赖,极大提升系统灵…...