Linux:基础开发工具

目录

软件包管理器yum

什么是软件包?

查看软件包

安装软件

卸载软件

vim

vim的基本操作

gcc/g++使用

预处理

编译

汇编

连接

make/Makefile

.PHONY伪目标

定义使用变量

版本控制器Git

安装git

git的使用

[git add](#git add)

[git commit](#git commit)

[git push](#git push)

[git pull](#git pull)

[git status](#git status)

[git log](#git log)

[调试器 - gdb/cgdb使用](#调试器 - gdb/cgdb使用)

基本使用

watch

[set var](#set var)

条件断点


软件包管理器yum

什么是软件包?

在Linux下我们该怎么下载安装软件?

一个常用的方法就是下载到程序的源代码,然后进行编译就能得到可执行程序

但是这样做太过麻烦了,于是就有一些人把一些常用的软件提前编译好做成软件包(windows的安装程序)放在一个服务器上,通过包管理器就可以很方便的获取到这个编译好的软件包,则可以直接进行安装

软件包和软件包管理器的关系类似于:

App和应用商店

而yum就是在Linux下常用的一种包管理器,主要用于Centos,RedHat,Fedora等发行版上

注意:

关于yum的所有操作必须保证主机网络畅通

可以通过ping指令验证

cpp 复制代码
ping www.baidu.com

查看软件包

我们可以使用一个指令查看所有的软件包

cpp 复制代码
yum list

但是由于软件包特别多,建议用grep过滤后再查看, 例如查看lrzsz

cpp 复制代码
yum list | grep lrzsz

安装软件

通过yum,我们可以用一行简单的命令来完成对软件包的安装(以安装lrzsz为例)

root用户:

cpp 复制代码
yum install lrzsz

普通用户

cpp 复制代码
sudo yum install lrzsz

这时候要输入root的密码,也就是说只有root才能对系统安装软件

因为按照这些软件也许是需要在根目录进行安装的,而有根目录安装权限的只有root

接下来yum会自动找到有哪些软件包需要安装,这时候需要敲"y"(yes)确认安装,也可以敲"n"(no)不安装

出现complete则表示安装完成

卸载软件

root用户:

cpp 复制代码
yum remove lrzsz

普通用户

cpp 复制代码
sudo yum remove lrzsz

具体原理和上面的安装软件类似

vim

vim的基本操作

【正常模式】切换至【插入模式】

输入a/i/o进入【插入模式】

  • 按「i」切换进入插入模式「insert mode」,按"i"进入插入模式后是从光标当前位置开始输入文件
  • 按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字
  • 按「o」进入插入模式后,是插入新的一行,从行首开始输入文字

移动光标

  • vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母「h」、「j」、「k」、
  • 「l」,分别控制光标左、下、上、右移一格
  • 按「G」:移动到文章的最后
  • 按「 $ 」:移动到光标所在行的"行尾"
  • 按「^」:移动到光标所在行的"行首"
  • 按「w」:光标跳到下个字的开头
  • 按「e」:光标跳到下个字的字尾
  • 按「b」:光标回到上个字的开头
  • 按「#l」:光标移到该行的第#个位置,如:5l,56l
  • 按[gg]:进入到文本开始
  • 按[shift+g]:进入文本末端
  • 按「ctrl」+「b」:屏幕往"后"移动一页
  • 按「ctrl」+「f」:屏幕往"前"移动一页
  • 按「ctrl」+「u」:屏幕往"后"移动半页
  • 按「ctrl」+「d」:屏幕往"前"移动半页

删除文字

  • 「x」:每按一次,删除光标所在位置的一个字符
  • 「#x」:例如,「6x」表示删除光标所在位置的"后面(包含自己在内)"6个字符
  • 「X」:大写的X,每按一次,删除光标所在位置的"前面"一个字符
  • 「#X」:例如,「20X」表示删除光标所在位置的"前面"20个字符
  • 「dd」:删除光标所在行
  • 「#dd」:从光标所在行开始删除#行

复制

  • 「yw」:将光标所在之处到字尾的字符复制到缓冲区中
  • 「#yw」:复制#个字到缓冲区
  • 「yy」:复制光标所在行到缓冲区
  • 「#yy」:例如,「6yy」表示拷贝从光标所在的该行"往下数"6行文字
  • 「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与"y"有关的复制命令都必须与"p"配合才能完成复制与粘贴功能

替换

  • 「r」:替换光标所在处的字符
  • 「R」:替换光标所到之处的字符,直到按下「ESC」键为止

撤销上一次操作

  • 「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次"u"可以执行多回复
  • 「ctrl + r」: 撤销的恢复

更改

  • 「cw」:更改光标所在处的字到字尾处
  • 「c#w」:例如,「c3w」表示更改3个字

跳至指定的行

  • 「ctrl」+「g」列出光标所在行的行号
  • 「#G」:例如,「15G」,表示移动光标至文章的第15行行首

【正常模式】切换至【末行模式】

输入[shift + :]也就是[:]进入【末行模式】

列出行号

  • 「set nu」: 输入「set nu」后,会在文件中的每一行前面列出行号

跳到文件中的某一行

  • 「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15, 再回车,就会跳到文章的第15行

查找字符

  • 「/关键字」: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。
  • 「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直 按「n」会往前寻找到您要的关键字为止

保存文件

  • 「w」: 在冒号输入字母「w」就可以将文件保存起来

离开vim

  • 「q」:按「q」就是退出,如果无法离开vim,可以在「q」后跟一个「!」强制离开vim
  • 「wq」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件

【插入模式】/ 【末行模式】切换至【正常模式】

输入ESC即可切换回正常模式

gcc/g++使用

格式:

cpp 复制代码
gcc [选项] 要编译的文件 [选项] [目标文件]

gcc选项

  • -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
  • -S 编译到汇编语言不进行汇编和链接
  • -c 编译到目标代码
  • -o 文件输出到文件
  • -static 此选项对生成的文件采用静态链接
  • -g 生成调试信息,GNU调试器可利用该信息
  • -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
  • -O0
  • -O1
  • -O2
  • -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
  • -w 不生成任何警告信息
  • -Wall 生成所有警告信息

我们知道一段代码要生成可执行程序需要分四个阶段:预处理、编译、汇编、连接,我们可以使用上面对应的选项生成

口诀:ESc

预处理

cpp 复制代码
gcc --E hello.c --o hello.i

编译

cpp 复制代码
gcc --S hello.i --o hello.s

汇编

cpp 复制代码
gcc --c hello.s --o hello.o

连接

cpp 复制代码
gcc hello.o --o hello

make/Makefile

make是一个命令,makefile是一个文件

makefile带来的好处就是自动化编译,一旦makefile里面的内容写好,只需要一个make命令就可以让整个工程完成自动编译,极大的提高了软件开发的效率

例如:

cpp 复制代码
code:code.c
    gcc -o code code.c

第一行表示依赖关系,第二行表示依赖方法

code是目标文件,code.c是源文件

code依赖于code.c

而所以code生成的方法就是第二行的gcc命令

这就是一段简单的makefile文件的内容,后续我们只需要在命令行输入一个make,即可自动生成code可执行程序

这里也有段简单的写法

cpp 复制代码
code:code.c
    gcc -o $@ $^

@表示目标文件(:左边的文件),^表示源文件(:右边的文件)

.PHONY伪目标

cpp 复制代码
code:code.c
    gcc -o code code.c

.PHONY:clean
clean:
    rm -f code

上面两行和上面一样,可以make生成code

工程是需要清理的

最后两行多出的功能是在命令行中输入make clean可以自动执行rm -f code

像clean这种没有被第一个目标文件直接或间接联系,那么它后面所定义的命令不会被自动执行,但是我们可以显示要make执行(make clean),以此来清楚所有的目标文件,以便重编译

但是一般这种clean的目标文件,我们可以将它设置为伪目标(倒数第三行)

伪目标的特性是:总是被执行的

一串命令并不是一定会被执行的,例如gcc -o code code.c命令

系统会根据code.c的修改时间和code的生成时间进行比较,若code.c的修改时间比code早,那么再次gcc可能不会重新生成code

为什么我们要重新生成code?

就像编译器中的重新生成解决方案的功能类似

若是我们给code也带上伪目标呢?

cpp 复制代码
.PHONY:code
code:code.c
    gcc -o code code.c

那么code就可以"总是被执行",系统就不会根据这些时间关系来决定是否要重新生成方案

定义使用变量

cpp 复制代码
BIN=proc.exe
CC=gcc
SRC=myproc.c
FLAGS=-o
RM=rm -f

$(BIN):$(SRC)
@$(CC) $(FLAGS) $@ $^
@echo "linking ... $^ to $@"
.PHONY:
clean:
@$(RM) $(BIN)
@echo "remove ... $(BIN)"

这些都是定义变量,这里定义了5个变量

使用方法:$(变量名)

这样也可以做到一样的效果,具体好处就和平时写代码的宏定义差不多

版本控制器Git

我们在编写文档的时候,为了防止文档丢失,更改失误后能够回到原来的版本,我们需要在原来的版本的时候复制一个文档出来

为了能够更方便我们管理这些不同版本的文件,便 有了版本控制器

目前主流的版本控制器就是Git

Git可以控制电脑上所有格式的文件,用Git就可以帮助我们管理软件开发项目中的源代码文件

安装git

cpp 复制代码
// centos等
yum install git
// ubuantu等
apt install git

git的使用

首先我们需要在gitee或者github创建一个仓库

在仓库内我们需要拿到仓库的链接(点击克隆/下载)

第一行https就是我们需要的链接

接下来需要在Linux本地创建好一个放置代码的目录

将刚刚的仓库克隆过来

cpp 复制代码
git clone [url]

url是我们刚刚复制的仓库链接

这样我们目录下就多了我们的仓库,就能看到我们仓库目前已有的内容了

如果我们想将文件上传到git备份,我们需要先将文件拷贝到我们刚刚克隆过来的目录下,然后使用下面的三板斧即可

git add

cpp 复制代码
git add [⽂件名]

将需要用git管理的文件告知git

git commit

cpp 复制代码
git commit -m "XXX"

commit相当于我们对刚刚add的文件进行一个描述(提交日志)

描述的内容就是""内的内容,该内容应当详细

git push

cpp 复制代码
git push

同步到远端服务器上

git pull

cpp 复制代码
git pull

当我们的仓库在别处上传了文件但当前目录下并没有此文件时,我们push文件的时候就会出错

原因是我们目前的仓库和在git管理的仓库已经发生了改动,我们这时候就需要pull拉取仓库更新的内容,这样就能恢复正常使用了

git status

cpp 复制代码
git status

如果我们忘记了当前git做到了哪一步,我们可以使用git status来看当前git的状态

git log

cpp 复制代码
git log

log就是日志

我们可以用它来看当前仓库曾经的各种上传记录及描述

调试器 - gdb/cgdb使用

gdb和cgdb调试器的用法几乎相同,但cgdb的使用比较方便,可以可视化代码

首先需要先安装cgdb

cpp 复制代码
sudo yum install -y cgdb
sudo apt-get install -y cgdb

当我们生成了一个可执行程序文件时,我们就可以用gdb/cgdb来调试该代码了

注意:

该代码编译时必须使用-g选项生成调试信息,否则会按照relese来编译,就无法调试

cpp 复制代码
gcc -o test -g test.c
g++ -o test -g test.cpp

基本使用

开始:

cpp 复制代码
// binfile表示可执行程序
gdb binfile
cgdb binfile

退出:

Ctrl + d 或 quit调试命令

|------------------------|------------------------|--------------------------|
| 命令 | 作⽤ | 样例 |
| list/l | 显⽰源代码,从上次位置开始,每次列出 10⾏ | list/l 10 |
| list/l 函数名 | 列出指定函数的源代码 | list/l main |
| list/l ⽂件名:⾏号 | 列出指定⽂件的源代码 | list/l mycmd.c:1 |
| r/run | 从程序开始连续执⾏ | run |
| n/next | 单步执⾏,不进⼊函数内部 | next |
| s/step | 单步执⾏,进⼊函数内部 | step |
| break/b [⽂件名:]⾏号 | 在指定⾏号设置断点 | break 10 break test.c:10 |
| break/b 函数名 | 在函数开头设置断点 | break main |
| info break/b | 查看当前所有断点的信息 | info break |
| finish | 执⾏到当前函数返回,然后停⽌ | finish |
| print/p 表达式 | 打印表达式的值 | print start+end |
| p 变量 | 打印指定变量的值 | p x |
| set var 变量=值 | 修改变量的值 | set var i=10 |
| continue/c | 从当前位置开始连续执⾏程序 | continue |
| delete/d breakpoints | 删除所有断点 | delete breakpoints |
| delete/d breakpoints n | 删除序号为n的断点 | delete breakpoints 1 |
| disable breakpoints | 禁⽤所有断点 | disable breakpoints |
| enable breakpoints | 启⽤所有断点 | enable breakpoints |
| info/i breakpoints | 查看当前设置的断点列表 | info breakpoints |
| display 变量名 | 跟踪显⽰指定变量的值(每次停⽌时) | display x |
| undisplay 编号 | 取消对指定编号的变量的跟踪显⽰ | undisplay 1 |
| until X ⾏号 | 执⾏到指定⾏号 | until 20 |
| backtrace/bt | 查看当前执⾏栈的各级函数调⽤及参数 | backtrace |
| info/i locals | 查看当前栈帧的局部变量值 | info locals |
| quit | 退出GDB调试器 | quit |

watch

watch可以监视一个表达式、变量的值

如果监视的表达式、变量的值发生变化,gdb/cgdb会暂停程序的执行,并通知使用者

cpp 复制代码
watch 变量

set var

set var可以让我们在调试中暂时修改某个表达式、变量的值,以确定是否是因此发生的错误

cpp 复制代码
set var 变量=值

条件断点

cpp 复制代码
b 9 if i == 30

b 9表示在第9行打断点,如果 i == 30则断点触发


相关推荐
梦游钓鱼3 分钟前
pyshark安装使用,ubuntu:20.04
linux·运维·ubuntu
火龙谷5 分钟前
CentOS7将yum源更换为国内源教程
linux·centos
战族狼魂30 分钟前
CentOS 上安装各种应用的命令行总结
linux·运维·centos
学Linux的语莫1 小时前
ansible变量
linux·运维·服务器·ansible
北京迅为1 小时前
【北京迅为】iTOP-4412全能版使用手册-第十二章 Linux系统编程简介
linux·嵌入式硬件·4412开发板
清源妙木真菌1 小时前
Linux:进程控制
linux
爱吃喵的鲤鱼1 小时前
Linux——文件系统清尾、动静态库
linux·运维·服务器
最数据1 小时前
Linux或者Docker中时区查询和修改(差8小时问题)
linux·运维·服务器·docker·.net
皓月盈江2 小时前
Linux宝塔部署wordpress网站更换服务器IP后无法访问管理后台和打开网站页面显示错乱
linux·服务器·wordpress·无法访问wordpess后台·打开网站页面错乱·linux宝塔面板·wordpress更换服务器
KeyBordkiller2 小时前
PVE相关名词通俗表述方式———多处细节实验(方便理解)
linux·服务器·网络