文章目录
- 常用工具
- 1.软件包管理工具
- 什么是软件包
- `yum`三班斧
- 1.查看
- 2.安装
- 3.移除
- 2.编辑器
- 3.编译器
- `gcc/g++`
- 编译器作用
- 编译过程
- 1.预处理
- 2.编译
- 3.汇编
- 4.链接
- 函数库
- 链接库文件的两种方式
- 4.调试器
- `gdb`
- 1.调试器加载程序
- 2.开始调试程序
- 3.常用调试指令
- 5.项目自动化构建工具
- `Makefile`/`make`
- `Makefile`的编写规则
- `make`的解释执行规则
- `make`的编写执行规则进阶版
- 伪对象的声明使用
- 6.项目版本管理工具
- `git`
- `git`使用
常用工具
1.软件包管理工具
什么是软件包
- 在Linux下安装软件,通常的办法是下载到程序的源代码,并进行编译,得到可执行的文件
- 但是这样太麻烦了,所以有些人把一些常用的软件提前编译好,做成了软件包
- 软件包和软件包管理器,就类似于手机上的应用商店
yum
是Linux下非常常用的包管理器
yum
三班斧
1.查看
yum
list
---->查看所有软件包yum
search
---->搜索指定软件包
2.安装
- 首先要进入管理员权限 ---->
su
root
yum
install
---->安装软件包
3.移除
- 首先要进入管理员权限---->
su
root
yum
remove
----->卸载安装包
我们想查看常用工具是否已经安装,可以查看每个工具的版本信息,如果找不到就代表没有安装
例如
vim
--version
gcc
--version
注意:关于yum
的所有操作必须保证主机网络畅通
💙💙💙💙💙💙💙💙💙💙💙💙💙平平无奇的分界线💙💙💙💙💙💙💙💙💙💙💙💙💙💙💙
2.编辑器
vim_42">vim
vim
是一个命令行编辑器,其中不能使用鼠标----在命令行中实现光标的移动,文本的操作,文本的编辑
vim_46">vim操作模式
总共有12种,常用三种:
1.插入模式:进行文本数据的编辑插入
2.普通模式:进行文本常见的操作-复制、剪切、粘贴、删除、撤销、返回、文本对齐、光标移动
3.底行模式:进行文本的保存和退出,以及文本的匹配查找替换操作
vim_56">vim使用
打开文件
vim filename
---->打开一个已有的文件若不存在就会创建,打开后默认处于普通模式
操作模式的切换
所有模式都是围绕普通模式进行切换的
1.普通模式—>插入模式
按
i
/a
/o
/I
/A
/O
从普通模式进入插入模式按
i
进入插入模式,是从光标当前位置开始输入文件按
a
进入插入模式,光标后移一个字符开始插入按
o
进入插入模式,在光标下面新插入一行,在行首开始插入,按
I
进入插入模式,是从光标所在行的行首开始插入按
A
进入插入模式,从光标所在行的行尾开始插入按
O
进入插入模式,在光标所在上一行插入新行,在行首进行插入
2.普通模式—>底行模式
- 英文
:
,从普通模式到底行模式:q
退出:w
保存:wq
保存并退出:q!
不保存的强制退出
3.其他模式—>普通模式
- 任何模式下按
ESC
键,都可以返回普通模式
普通模式下的操作指令
1.光标移动
h
/j
/k
/l
:按字符的上下移动w
/b
:按单词的左右移动ctrl
+f
/b
:上下翻页gg
/G
:首行/尾行
2.文本操作
yy
:将光标所在之处到字尾的字符复制到缓冲区中nyy
:复制从光标所在行往下数的n行文字dd
:删除光标所在行ndd
:删除从光标开始行往下的n行x
:删除字符dw
:删除单词p
:将缓冲区的字符粘贴到光标所在位置P
:将缓冲区的字符粘贴至光标所在上一行
在vim中没有剪切,删除就是剪切,虽然看到数据被删除了,但是也复制到剪切板上了
3.其他操作
u
:撤销上一次操作
ctrl
+r
:撤销的反向操作
gg=G
:全文对齐
sudo
功能:临时为用户操作提权,不用每次都切换到管理员用户了
但是sudo
是需要配置的
1.
su
root
切换到管理员用户2.
visudo
打开sudo
配置3.:90 跳转到文档第90行,90 行附近
4.
yy
复制root
这一行,p粘贴5.将用户名从
root
变成自己的用户名称6.
:wq
保存退出
💙💙💙💙💙💙💙💙💙💙💙💙💙平平无奇的分界线💙💙💙💙💙💙💙💙💙💙💙💙💙💙💙
3.编译器
gcc/g++
gcc
是C语言编译器,g++
是c++语言编译器,不同的语言有不同的编译器
编译器作用
C语言,C++语言都是高级语言,机器无法识别这些代码,需要编译器,将高级语言代码解释成为机器指令,生成可执行程序文件再能执行
可执行程序文件:一段功能的机器指令集
编译型语言:c/c++
程序编译后才可以执行 ,运行性能高,编码较慢
脚本型语言 :python/lua/shell
编写完毕直接执行 逐行解释型语言,由解释工具逐行解释,然后执行功能,编码较快,但运行性能低
编译过程
1.预处理
gcc -E a.c -o a.i
gcc -E b.c -o b.i
展开所有代码(引入头文件,宏替换,删除注释…)
gcc
-E
(只预处理)
2.编译
gcc -S a.i -o a.s
gcc -S b.i -o b.s
进行语义语法纠错,没有错误将代码解释成为汇编代码
gcc
-S
(只进行编译)
3.汇编
gcc -c a.s -o a.o
gcc -c b.s -o b.o
将汇编代码解释成为机器指令
gcc
-c
(只进行汇编)
4.链接
gcc a.o b.o -o main
将所有用到的机器指令文件打包到一起,生成可执行程序
gcc
-o
(指定要生成的文件名称)
📍我们在C语言中并没有定义printf函数,而且在预编译中包含的头文件中也只有函数的声明,那是哪里实现printf函数的呢?
这里引入一个重要概念
函数库
图中libc是标准c库,printf就是标准c库中的函数,
gcc编译器在链接生成可执行程序的时候,会自动链接标准c库
链接库文件的两种方式
gcc中默认动态链接
1.动态链接:链接动态库,在可执行程序中记录函数符号信息表,生成的可执行程序比较小,但是运行时需要加载动态库,多个程序会在内存中使用同一个相同的库,不会再内存中造成代码冗余
2.静态链接:链接静态库,直接将使用的函数实现写入可执行程序中,生成的可执行程序比较大,但是运行时不需要额外依赖加载库文件,但是如果多个程序使用了相同的静态库,则运行起来会在内存中造成代码冗余
💙💙💙💙💙💙💙💙💙💙💙💙💙平平无奇的分界线💙💙💙💙💙💙💙💙💙💙💙💙💙💙💙
4.调试器
gdb
-
调试一个程序的运行过程,能让我们从运行过程中发现程序哪里有问题,可以适当的改变数据达到某种调试目的
-
不是所有的程序的都可以调试,调试器只能调试具有调试符号信息的程序—>debug版本的程序
-
gcc生成可执行程序,默认会生成release版本的程序,程序中没有调试符号信息,想要生成debug版本需要加上
-g
选项- gcc -g a.c b.c -o mian
1.调试器加载程序
gdb
./main
直接使用gdb加载程序
2.开始调试程序
- run 直接运行
- start 开始逐步调试
3.常用调试指令
1.流程控制
next
/n
:下一步,遇到函数直接运行,不会跟踪进入step
/s
:下一步,遇到函数则跟踪进入函数list
/l
:默认查看调试行附近代码,也可指定行—>list
file
:line
until
:直接运行到指定行,也可以指定文件—>·until
a.c
line
continue
/c
:继续运行,直到断点处停下
2.断点操作
break
/b
指定文件
:指定行
:给指定文件的指定行打断点break
function
:给函数打断点info
break
:查看断点信息watch
变量
:给变量打断点,放变量数据改变的时候停下delete
/d
:删除断点
3.调用栈操作
p
:查看变量数据---->print a;a
=10---->设置变量数据backtrace
/bt
:查看程序运行调用栈信息,程序一旦崩溃,查看调用栈可以快速定位崩溃位置—>栈顶函数
💙💙💙💙💙💙💙💙💙💙💙💙💙平平无奇的分界线💙💙💙💙💙💙💙💙💙💙💙💙💙💙💙
5.项目自动化构建工具
Makefile
/make
Makefile:普通文本文件,用于记录项目的构建规则流程
make:Makefile解释程序,逐行解释Makefile中项目的构建规则,执行构建指令,完成项目的构建
Makefile
的编写规则
第一步.目标对象:依赖对象
第二步.制表符\t
执行指令
目标对象:是要生成的可执行程序的名称
依赖对象:是生成目标对象所需要的源码文件
如果你出现了和我一样,下面这张图的错误,不同担心,这代表编辑 makefile 时出现格式错误了
记住:第二行gcc前面需要按下Tap
键来空出空格,其他的都无效
修改以后,就没有问题了
make
的解释执行规则
1.make一旦执行,就会在当前目录寻找Makefile
2.make的执行规则中,要生成目标对象,首先要保证依赖对象已经生成,若没有生成,则会递归向下寻找依赖对象的生成规则
3.在Makefile中找到第一个目标对象,根据依赖对象的时间关系,判断是否需要重新生成
生成第一个对象后,make就会退出,不会继续生成第二个对象
📍如果非要生成两个对象呢?
也可以
方法如上图,结果如下图
4.若是需要重新生成,则执行对应下方的指令(指令不是非要生成对象的指令,也可以是打印等)
make
的编写执行规则进阶版
make 中的预定义变量
- $@:表示目标对象
- $^:表示所有依赖对象
- $<:表示所有依赖对象中第一个依赖对象
这样是不是还有点麻烦,通配符%的使用
简洁多了~
伪对象的声明使用
.PHONY:目标对象的名称
作用:不管对象是否最新,每次都要重新生成
💙💙💙💙💙💙💙💙💙💙💙💙💙平平无奇的分界线💙💙💙💙💙💙💙💙💙💙💙💙💙💙💙
6.项目版本管理工具
git
git
:项目的版本管理工具
版本管理工具:对项目的开发周期进行管理,每一次提交的修改都会有对应的版本号,能够让我们在程序的时候回滚回去
git
使用
1.从远程仓库克隆到本地
git clone URL
2.本地提交修改信息
git add ./*
3.提交本次版本管理
git commit -m “内容”
4.将本次版本提交到远程服务器仓库
git push origin master
origin用于指定分支名称
💙💙💙💙💙💙💙💙💙💙💙💙💙平平无奇的分界线💙💙💙💙💙💙💙💙💙💙💙💙💙💙💙