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

Linux开发工具

前言:哈喽小伙伴们,经过前边的学习我们已经掌握了Linux的基本指令和权限,相信大家学完这些之后都会对Linux有一个更加深入的认识,但是Linux的学习可以说是从现在才刚刚开始。

这篇文章,我们将讲解若干个Linux的开发工具,让我们能够开始使用Linux来做一些事情。


目录

一.yum

1.什么是yum

2.yum操作

(1)搜索

 (2)安装

(3)运行

(4)卸载

二.vim

1.什么是vim

(1)命令模式

(2)插入模式

(3)底行模式

 2.vim配置

三.gcc/g++

1.指令

2.翻译过程

四.make/makefile

五.gdb

1.什么是gdb

2.gdb操作

总结


一.yum

1.什么是yum

相信现在没有年轻人不会从手机或者电脑上下载各种各样的APP软件,但是你们知道这些APP为什么能被下载到手机上吗???

除了能够直接从浏览器上下载安装包之外,每个手机和电脑上都会有原装应用商店,我们都是通过应用商店这个媒介,从应用厂商的服务器中将应用的安装包提取到自己的设备上在进行安装。

yum,就是这些应用商店,是一个软件下载安装管理的一个客户端

我们可以通过yum,在Linux系统中安装一些东西。那具体的安装过程又是怎样的呢???

通过yum安装指令按照要安装的东西去寻找对应的服务器。但是我们为什么能找到对应的应用厂商的服务器呢???

这是因为,我们的机器内部,内置了目标服务器的地址链接


2.yum操作

(1)搜索

yum list | grep XXX

通过该指令,便可以搜索到所有携带XXX的软件,比如说我们搜索带有“sl”的软件:

等待一段时间之后就会给我们罗列出所有携带“sl”软件。


 (2)安装

sudo yum (-y) install XXX

通过该指令就可以将对应的XXX软件进行安装。因为安装软件是在对应的root目录下进行的,所以要加上sudo,让我们的普通用户权限升级为root权限。比如说安装一个名为“sl.x86_64”的软件:

这里的“sl.x86_64”中,sl是软件名称,x86_64为软件的运行环境

安装时会有一个确认,确认一下是否安装,如果不想确认,便可在指令中加上“-y”,强制安装

调用指令后要输入对应的普通用户的密码,然后等待安装完成即可。


(3)运行

安装之后直接输入软件名字即可实现运行,这里我们运行一下“sl”:

能够看出此软件的功能就是在屏幕上驶过一辆火车。 


(4)卸载

sudo yum(-y)remove XXX

能够安装同样就能卸载,使用上述指令便可将XXX软件进行卸载。例如我们将“sl”进行卸载:

如图所以,如果指令不加“-y”,卸载时就会给出一个确认,是否要删除,如果不想确认,就可以加上“-y”,直接强制卸载。 


二.vim

学过这么多知识之后,我们终于可以开始在Linux上编写代码啦,而Linux系统中,供我们编写代码的工具即为vim


1.什么是vim

vim一Linux系统下的一款多模式的编辑器。那么何为多模式呢???

vim编辑器下一共分为三种模式:

命令模式:允许使用者通过命令来进行文本的编辑控制。

插入模式:编辑模式

底行模式:用来让vim进行包括但不限于shell之间的交互。

下面我们就通过讲解vim使用方法的同时,来介绍这三种模式。


(1)命令模式

vim的使用方法为:

vim XXX文件

通过vim+XXX文件指令,能够让我们对该文件进行编写,同时进入vim的编辑器窗口: 

 但是会发现我们进入该窗口之后,并不能立即写代码,并且按某些按键时不会有任何反应

这是为什么呢???

实际上,刚进入vim编辑器时,我们就是处在命令模式之中,随后通过执行某些命令来实现编辑器对文本的各种操作。下面是常用的操作指令,均在光标所在处执行:

n + yy:复制当前n行

n + p:将复制内容粘贴n次

u:撤销,ctrl + u:恢复上一次撤销。

n + dd:剪切/删除指定n行

shift + 4:将光标定位到当前行的结尾。

shift + 6:将光标定位到当前行的开始。

gg:将光标定位到整个文本的最开头。

shift + g:将光标定位到整个文本的最后一行。

n + shift + g:将光标定位到文本的第n行。

h,j,k,i:分别能让光标进行左、下、上、右移动,也可带n,直接移动n次。

w:按照单词为单位进行光标后移。

b:按照单词为单位进行光标前移。

shift + ~:将指定字母进行大小写切换。

n + x:删除光标后续的n个字符。

n + shift + x:删除光标之前的n个字符。

n + r:对包括光标指定的字符及其后边的共n个字符进行替换。

shift + r:进入替换模式,可以对文本的任意字符进行替换。

shift + zz:保存并退出

批量化注释操作:

ctrl + v:通过方向键选中若干行;shift + i,进入插入模式;//,注释第一行;Esc,选中行全部注释

批量化去注释:

ctrl + v:通过方向键选中若干行;d,删除选中。

以上所有指令,不加n均代表只执行一次


(2)插入模式

在命令模式下,按下键盘上的“i”键,就可以进入插入模式,也就是说可以进行编写操作了:

能够看出在插入模式下,窗口的左下角会有INSERT,也就是插入的英文

编写完代码之后,想要退出插入模式,则需按下Esc键,便可从插入模式退出回命令模式

除了i之外,a、o键同样可以进入插入模式,但是三者有所不同:

i:进入插入模式不会移动光标。

a:进入插入模式会将光标后移一位。

o:进入插入模式会直接另起一行。


(3)底行模式

当我们代码编写完之后,想要退出vim时,需要在命令模式的前提下,同时按下SHIFT+;/:两个键位,此时窗口的左下角便会有一个“:”,代表着进入了底行模式

底行模式下,“w”键表示保存,“q”键表示退出,所以在编写之后想要退出vim,便可输入wq,随后回车,便可同时完成保存+退出

退出之后来看我们的文件,内容确实存在。

在底行模式下也同样有若个常用指令:

w:保存

q:退出

!:强制

set nu:显示行号

set nonu:去除行号

/+关键字:搜索文本中指定的关键字

! + 指令:无需退出vim,可以进行shell命令的执行,常用函数查看

vs 文件名:分屏,多文件操作

ctrl + ww:不同文件之间的光标转移


 2.vim配置

虽然我们已经了解了怎么用vim编程,但是他并没有像其他编程软件一样能够简单快捷的补全代码,自动缩进之类的操作,这就需要我们自己来对vim进行配置。

首先,在自己的家目录下建立一个名为.vimrc的文件:

但是我们找不到vimrc文件 ,这是因为"."的作用是将vimrc文件隐藏

随后我们用vim对.vimrc文件进行编写

比如我们写上一个get nu显示行号的指令后保存退出。之后我们再在家目录下使用vim写文件时,就会自动显示行号

还有其他有帮助的指令就需要靠大家自己去配置了。


三.gcc/g++

gcc和g++是两种文件编辑器能够执行我们所编写的代码。不同的是,gcc只能执行c语言代码,g++则既可以执行c语言代码,也可以执行c++代码

1.指令

我们以gcc为例来讲解这两种编辑器的具体使用: 

 如图,我们新建一个名为test.c的c语言文件,并编写一个循环代码后保存退出。

随后通过指令gcc + 文件名,对文件进行编译,同时默认生成一个名为a.out的可执行程序。 

最后通过指令./+可执行程序名,便可执行程序。 

同时我们也可以在编译文件时,通过指令 gcc + 文件名 + -o + 可执行程序名,来指定生成的可执行程序的名字


2.翻译过程

一段程序的翻译过程并没有我们所认为的那么简单,它一共分为四个步骤

  1. 预处理:宏替换,去注释,头文件展开,条件编译
  2. 编译:将C变成汇编语言
  3. 汇编:将汇编语言编译成为二进制目标文件
  4. 链接:形成可执行程序

我们也可以通过在指令中添加如下部分,将一段程序的运行过程停留在这四种阶段并展示结果

-E:只激活预处理,但不会生成文件,需要自己把它重定向到一个输出文件中

-S:编译到汇编语言不进行汇编和链接

-c:编译到目标文件

-o:文件输出到文件


四.make/makefile

虽然我们已经认识和了解到了如何使用vim和gcc/g++来编写和运行文件,但是使用它们还是需要我们自己去一次一次的执行指令总归还是没有像我们使用的VS等编译器方便

make和makefile的作用,就是将这些指令整合在一起,达到一次执行的目的

首先我们要知道,make是一个命令,而makefile是一个文件需要我们自己去创建和编写

当我们执行make指令时,它会自动进入当前目录下的makefile文件中,并执行存在里边的指令

如图,我们创建了makefile文件,并在里边编写如上代码。

调用make命令, 发现文件里的gcc -o mytest test.c 指令被执行生成名为mytest的可执行程序。 这便是make/makefile的基本用法

再来看makefile文件的内部:

前两行为一个整体mytest为目标文件,冒号“:”表示依赖关系,test.c则为依赖文件(可以不止一个,用空格隔开)。

第二行称为依赖方法初始使用tab键空位(不能是四个空格),随后是一段指令,连接目标文件和依赖文件依赖方法可以不只是一个,可以多行调用多个指令,这些指令会按照从上到下的顺序一一执行

下面我要再添加一个:

再去执行: 

能够看出,当我们的指令和依赖文件无关时,依赖文件可以不写,只需要一个目标文件。

同时,当makefile文件中有多个目标文件时,如果只单独调用make,它默认只会执行第一个目标文件,执行其他目标文件则需要在make后加上目标文件名

再来看:

当我们多次调用mytest目标文件时,因为第一次已经生成了可执行程序,所以之后的调用都会提示说mytest已经是最新的,无法重复调用

但是如果非要重复调用也不是不行,但是需要增加一个东西

.PHONY可以解除限制,使该目标文件能够多次调用:

虽然能多次调用,但并不会生成多个可执行程序,所以一般不推荐其使用于对文件的各种操作上

 此外,目标文件和依赖文件还可以用符号来代替

其中“@”代表目标文件,“^”代表依赖文件(多个依赖文件可代替整体),$则起到替换的作用

 除此之外,我们还可以定义两个量来代替目标文件和依赖文件

如图,我们定义bin作为目标文件,src作为依赖文件随后对其赋值进行使用

这就相当于是C语言中的宏下边的指令不用变化,要改变时只用改变对bin和src的赋值即可。 

 

我们发现,使用make来执行这些指令时,都会自动显示,那如果我们不想显示,该如何隐藏呢?

很简单,只需要在指令前加@即可:


五.gdb

1.什么是gdb

通过上面四种工具的学习,我们已经能够实现在Linux上编辑代码,运行代码,但是还少了一个重要的东西,那就是调试代码

而gdb就是Linux调试器


2.gdb操作

我们知道,在我们的编译器上有debug和releae两个不同的版本类型。其中debug是程序员的开发和调试版本,专用于代码的编写和调试,而release则是最终授予用户使用的版本,其特点是代码已经经过测试,不含任何bug并且代码量和速度都达到最优

在我们的Linux系统下,由gcc默认生成的可执行程序都是release版本,是不能进行调试的,所以我们需要使用指令 gcc -o xxx  xxx  -g来生成一个debug版本下的可执行程序进行调试

现在有一个文件名为test.c,我们使用指令生成一个debug版本下的可执行程序: 

 gdb的使用方法为:gdb + 可执行程序名

成功执行指令之后就会现在该段内容,随后我们就可以输入gdb下的各种指令来实现调试啦:

  • quit:退出gdb
  • list / l 行号:显示文件源代码,每次显示10行,回车可继续显示
  • list / l 函数名:显示函数的源代码
  • r / run:运行程序
  • n / next:单条执行,逐过程
  • s / step:进入函数调用,逐语句
  • break / b 行号:在某行设置断点
  • break / b 函数名:在某函数开头设置断点
  • info / i  break / b:查看断点信息
  • d 断点编号:删除断点
  • disable / enable:禁用(非删除)/开启断点
  • finish / f:执行到当前函数返回,然后停下来等待指令
  • printf / p 变量/变量地址:查看变量内容或变量地址
  • display 变量/变量地址:跟踪查看变量值或变量地址,每次停下来都显示
  • undisplay:取消变量跟踪
  • until 行号:跳转到指定行,中间的代码会运行

总结

关于Linux的基本操作工具到这里就分享完啦,希望能够对大家有所帮助。

喜欢博主文章的小伙伴记得一键三连哦,我们下期再见啦!

相关文章:

Linux开发工具

前言:哈喽小伙伴们,经过前边的学习我们已经掌握了Linux的基本指令和权限,相信大家学完这些之后都会对Linux有一个更加深入的认识,但是Linux的学习可以说是从现在才刚刚开始。 这篇文章,我们将讲解若干个Linux的开发工…...

C++ 动态规划 线性DP 最长共同子序列

给定两个长度分别为 N 和 M 的字符串 A 和 B ,求既是 A 的子序列又是 B 的子序列的字符串长度最长是多少。 输入格式 第一行包含两个整数 N 和 M 。 第二行包含一个长度为 N 的字符串,表示字符串 A 。 第三行包含一个长度为 M 的字符串,表…...

【备战蓝桥杯】——循环结构终篇

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-yl4Tqejg4LkjZLAM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...

为什么说Python语法简单?

Python被广泛认为是一种语法简单、易学易用的编程语言,这种观点有几个关键的原因: 1、清晰简洁的语法结构: Python采用了清晰而简洁的语法结构,使得代码易于阅读和理解。Python的语法设计强调代码的可读性,采用了清晰…...

【HarmonyOS应用开发】ArkUI 开发框架-进阶篇-管理组件状态(九)

管理组件状态 一、概述 在应用中,界面通常都是动态的。下图所示,在子目标列表中,当用户点击目标一,目标一会呈现展开状态,再次点击目标一,目标一呈现收起状态。界面会根据不同的状态展示不一样的效果。 Ar…...

EF Core入门例子(以SqLite为数据库)

测试环境: visual studio 2017 .net core 2.1 具体步骤如下: 1 新增名称为EFCoreDemo的.net core控制台程序,版本选择.net core 2.1,项目不能放到带中文的目录下,不然到后面执行Add-Migration命令时会报如下的错误…...

centos7 安装nginx

在 CentOS 7 上安装 Nginx,你可以选择从官方仓库(EPEL)安装,或者手动编译安装。以下是通过 EPEL 安装 Nginx 的步骤: 方法一:通过 EPEL 仓库安装 添加 EPEL 仓库: sudo yum install epel-relea…...

【Linux Day14 UDP网络通讯】

UDP网络通讯 UDP报文结构: 16位源端口:用于记录发送端的端口号(占用两个字节)16位目的端口:用于记录接收端的端口号(占用两个字节)16位UDP长度:确定UDP报文总长度,&…...

指针的深入了解6

1.回调函数 回调函数就是一个通过函数指针调用的函数。 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数 时,被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用&#xff0…...

PHP之PDO_MYSQL扩展安装步骤

1,如果有php源码包可以不用下载,在 源码包下的 ext/ 下面可以找到 cd php-8.1.9/ext/pdo_mysql 2,如果存在,直接安装 /usr/local/php-8.1.9/bin/phpize ./configure --with-php-config/usr/local/php-8.1.9/bin/php-config make &&a…...

【pytorch】nn.linear 中为什么是y=xA^T+b

我记得读教材的时候是yWxb, 左乘矩阵W,这样才能表示线性变化。 但是pytorch中的nn.linear中,计算方式是yxA^Tb,其中A是权重矩阵。 为什么右乘也能表示线性变化操作呢?因为pytorch中,照顾到输入是多个样本一起算的&…...

vite打包原理

vite 工程化开发:打包工具 启动速度很快 核心原理还是webpack 把webpack封装了,把webpack对象封装了 和vue2整体结构几乎一致 webpack两种模式:开发&生产 代码打包编译,本地起一个web服务器实时预览编译后的结果 build 命令模…...

导出pdf 加密、加水印、加页脚

1.依赖 <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.10</version> </dependency> <dependency> …...

Flutter 仿抖音 TikTok 上下滑动 播放视频

Flutter 仿抖音 TikTok 上下滑动 播放视频UI框架&#xff0c;视频播放使用 video_player github&#xff1a;GitHub - PangHaHa12138/TiktokVideo: Flutter 仿抖音 TikTok 上下滑动 播放视频UI框架 实现功能&#xff1a; 1.上下滑动自动播放切换视频&#xff0c;loading 封面…...

计算机网络——网络层(2)

计算机网络——网络层&#xff08;2&#xff09; 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU)前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff0c; [跳转到网站](https://www.captainbed.…...

01-16Maven-SpringBoot入门

Maven继承Maven高级SpringSpringBoot入门 Maven 一、概念及功能 概念&#xff1a;Maven是Apache软件基金会组织维护的一款专门为Java项目提供项目构建和依赖管理的工具 1.1作用&#xff1a; 项目构建 构建&#xff1a;是一个将代码从开发阶段到生产阶段的一个过程&#xf…...

微信小程序(二十七)列表渲染改变量名

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.改变默认循环单元item变量名 2.改变默认循环下标index变量名 基础模板有问题可以先看上一篇 源码&#xff1a; index.wxml <view class"students"><view class"item"><te…...

k8s之安装部署及kuboard发布应用

目录 环境准备 系统规划 配置免密 将桥接的IPv4流量传递到iptables的链 系统基础配置 安装docker 安装docker及基础依赖 配置docker的仓库下载地址 部署k8s 添加阿里云的k8s源 安装kubeadm&#xff0c;kubelet和kubectl 初始化masteer节点 部署node节点 部署flanne…...

JProfiler for Mac:提升性能和诊断问题的终极工具

在当今的高性能计算和多线程应用中&#xff0c;性能优化和问题诊断是至关重要的。JProfiler for Mac 是一个强大的性能分析工具&#xff0c;旨在帮助开发者更好地理解其应用程序的运行情况&#xff0c;提升性能并快速诊断问题。 JProfiler for Mac 的主要特点包括&#xff1a;…...

力扣202-快乐数

快乐数 题目链接 解题思路&#xff1a; 两个指针&#xff0c;一快一慢&#xff0c;如果相遇&#xff0c;就会生成环如果环内元素为1,那么就可以返回 class Solution { public:int get(int n){int res 0;while(n){res (n%10) * (n%10);n / 10;}return res;}bool isHappy(int …...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...