目录
[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使用)
[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则断点触发
完