Linux下环境基础开放工具
1.Linux软件包管理器yum
1.1 认识软件包以及管理器
在Linux中软件包和软件管理器就好比“App”和“应用商店”的关系
而yum是Linux下非常常用的一种软件包管理器
注意:yum的操作需要保证主机的网络畅通
可以用ping指令验证:
ping www.baidu.com
1.2 查看软件包
yum list命令可以罗列出当前一共有哪些软件包,而grep命令可以筛选出我们关注的包,例如:
yum list | grep lrzsz
结果如下:
lrzsz.x86_64 0.12.20-36.el7 @base
注意事项: 1.x86_64后缀表示64位系统的安装包,i686则表示32位系统安装包
2.el7表示操作系统发行版的版本这里表示的是centos7
3.base表示的是“软件源”的名称
1.3如何安装软件
通过yum,我们可以通过简单的一条命令完成软件的安装
sudo yum install lrzsz
yum会找到有哪些软件包需要下载,然后敲y确认安装即可
当出现complete字样时,说明安装完成
注意事项:
1.安装软件要在root用户下才行,所以要sudo
2.yum安装软件只能一个个安装,如果在安装的过程中再安装其他的就会报错
1.4 如何卸载软件
跟安装软件一样,也是一条指令就可以执行
sudo yum remove lrzsz
2.Linux编辑器-vim的使用
2.1 vim的基本概念
vim分为三种模式,分别为命令模式,插入模式还有底行模式
命令模式:控制屏幕光标的移动,字符,字或行的删除
插入模式:只有在该模式下才能做文字输入,该模式是我们后面用的最频繁的编辑模式
末行模式:文件保持或退出,也可以进行文件的替换,找字符串,列出行号等操作
以下为三种模式之间的转换:
2.2 vim的基本操作
输入vim加文件名称,进入vim全屏幕编辑画面:
vim test.c 后进入vim模式,如下图所示:
此时的状态是命令模式,要转换为插入模式才能输入文字
关于退出vim及保存文件,在底行模式下才能进行:
输入w(保存当前文件)
输入wq(存盘并退出vim)
输入q!(不存盘退出vim)
2.3 vim正常模式命令集
移动光标:
1.在vim中上下左右是由h,j,k,l这四个键来控制
2.G:可以移动到文章的最后
3.$:移动到光标所在行的行尾
4.^:移动到光标所在行的行首
5.w:跳到下一个的开头
6.e:光标跳到下一个字的字尾
7.b:光标回到上一个字的开头
8.#l:光标移到该行的第#个位置,如:5l,56l
9.gg:进入到文本的开始
10.shift+g:进入文本的末端
11.ctrl+b:屏幕往后移动一页
12.ctrl+f:屏幕往前移动一页
13.ctrl+u:屏幕往后移动半页
14.ctrl+d:屏幕往前移动半页
删除文字:
1.x:每按一次,删除光标所在位置的一个字符
2.#x:#代表输入的数字,而#x意思是删除光标所在位置后面#个字符
3.X:大写的X,每按一次删除光标所在位置前面的一个字符
4.#X:删除光标所在位置前面#个字符
5.dd:删除光标所在行
6.#dd:从光标所在行开始删除#行
复制:
1.yw:将光标所在之处到字尾的字符复制到缓冲区中
2.#yw:复制#个字到缓冲区
3.yy:复制所在行的字符到缓冲区
4.#yy:复制#行的字符到缓冲区
5.p:将缓冲区字符贴到光标所在位置,相当于粘贴的作用
替换:
1.r:替换光标所在处的字符
2.R:替换光标所到之处的字符,直到按下ESC为止
撤销上一次操作:
1.u:回到上一个操作,可以多次执行
2.ctrl+r:撤销的恢复
更改:
1.cw:更改光标所在处的字到字尾处
2.c#w:例如,c3w表示更改3个字
跳至指定的行:
1.ctrl+g:列出光标所在行的行号
2.#G:移到光标到文章的第#行
2.4 vim末行模式命令集
列出行号:
set nu:每一行前面列出行号
跳到文件中的某一行:
#+回车键:跳到第#行
查找字符:
1./关键字:先按/键,再输入想要找的字符,如果找到的第一次关键字不是想要的,可以一直按n往后找到想要的关键字为止
保存文件:
输入w即可保存
离开vim:
1.q:按q就是退出,如果无法离开后面加个!强制离开vim
2.wq:退出加保存文件
2.6 vim的配置
3.Linux编译器-gcc/g++的使用
3.1.gcc/g++编译的过程
1.预处理(进行宏替换)
2.编译(生成汇编)
3.汇编(生成机器可识别的代码)
4.连接(生成可执行文件或库文件)
3.2 gcc如何完成
格式:gcc[选项] 要编译的文件 [选项] [目标文件]
3.2.1 预处理
预处理功能主要包括宏定义,文件包含条件编译,去注释等。
预处理指令是以#号开头的代码行
实例:gcc-E hello.c -o hello.i
选项-E是预处理后停止编译过程
选项 -o 是指目标文件,.i 文件为已经过预处理的C原始程序
3.2.2 编译
在这个阶段gcc首先要检查代码的规范性,检查语法错误等,检查无误后将代码翻译为汇编语言
选项 -E,该选项作用是让gcc编译结束后不进行汇编了
实例: gcc -S hello.i -o hello.s
3.2.3 汇编
汇编阶段是把编译生成的.s文件转换为目标文件
读者在此可用选项-c可以看到汇编代码转换为.o的二进制目标代码了
实例:gcc -c hello.s - o hello.o
3.2.4 连接
连接后就可以生成可执行文件或库文件
实例: gcc hello.o -o hello
3.2.5 函数库
在linux中函数库是预编好的二进制代码集合,它们包含了一系列函数和符号,可供开发者在程序中调用,而函数库又分为静态库和动态库两种。
静态库:编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也不再需要库文件,其后缀一般为".a”
动态库:动态库与静态库不同,在执行程序时由运行时链接文件加载库,这样可以节省系统的开销,动态库后缀名为.so,gcc默认使用动态库
动静态库对比:
1.动态库形成的可执行程序体积比较小
2.可执行程序对静态库的依赖度小,而动态库依赖程度大,动态库被多个程序共享,一旦缺失,会导致所有程序,无法执行。
3.程序运行时,需要加载到内存,静态链接的,会在内存中出现大量重复的代码
4.动态链接比较节省内存和磁盘空间
4.自动化构建-make/Makefile
4.1 背景
1.make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
2.一个工程中源文件不计数,其按类型,功能,模块分别放在若干个目录,makefile定义了一系列规则来指定,哪些文件需要先编译,哪些文件需要后编译,以及一些更复杂的功能操作
3.makefile带来的一大好处就是:自动化编译,一旦写好就只需要make命令就可以进行自动编译,极大提高了软件开发的效率
4.2 理解
makefile的基本概念--依赖关系和依赖方法
第一行为依赖关系,第二行为依赖方法。
理解: 月底生活费不够,向爸爸要钱,你和爸爸属于依赖关系,要钱属于依赖方法。
4.3 基本使用
myproc.c文件
#include<stdio.h>
int main()
{
printf("hello Makefile\n");
return 0;
}
Makefile文件
myproc:myproc.c
gcc -o myproc myproc.c
.PHONY:clean
clean:
rm-f myproc
此时make就会执行gcc-o myproc myproc.c,make扫描makefile文件,从上到下扫描,默认形成第一个目标文件。
而make clean就会执行rm-f myproc,但是一般这种clean的目标文件,我们将它设置为伪目标,用.PHONY修饰,伪目标的特性是总是被执行。
总是被执行:即改命令可以被多次执行
stat 指令可以查看文件的状态
stat myproc就可以查看myproc的状态
文件 = 内容+属性
$ stat XXXFile: ‘XXX’Size: 987 Blocks: 8 IO Block: 4096 regular fileDevice: fd01h/64769d Inode: 1321125 Links: 1Access: (0664/-rw-rw-r--) Uid: ( 1000/ whb) Gid: ( 1000/ whb)Access: 2024-10-25 17:05:30.430619002 +0800Modify: 2024-10-25 17:05:25.940595116 +0800Change: 2024-10-25 17:05:25.940595116 +0800上面就是使用stat指令后的内容其中1.Modify:内容变更,时间更新2.Change:属性变更,时间更新3.Access:常指的是文件最近一次被访问的时间
.PHONY:让make忽略源文件和可执行目标文件的M时间对比
4.4 makefile的推导过程
myproc:myproc.ogcc myproc.o -o myprocmyproc.o:myproc.sgcc -c myproc.s -o myproc.omyproc.s:myproc.igcc -S myproc.i -o myproc.smyproc.i:myproc.cgcc -E myproc.c -o myproc.i.PHONY :cleanclean:rm -f *.i *.s *.o myp
编译后:
$ makegcc -E myproc.c -o myproc.igcc -S myproc.i -o myproc.sgcc -c myproc.s -o myproc.ogcc myproc.o -o myproc
make的工作流程:
1.make会在当前的目录下找名字叫做“Makefile”或“makefile”的文件
2.如果找到,它就会找到第一个目标文件,即上面例子中的myproc这个文件,并把它作为最终的目标文件
3.如果 myproc ⽂件不存在,或是 myproc 所依赖的后⾯的 myproc.o ⽂件的⽂件修改时间要 ⽐ myproc 这个⽂件新(可以⽤ touch 测试),那么,他就会执⾏后⾯所定义的命令来⽣成myproc 这个⽂件。
4.如果 myproc 所依赖的 myproc.o ⽂件不存在,那么 make 会在当前⽂件中找⽬标为 myproc.o ⽂件的依赖性,如果找到则再根据那⼀个规则⽣成 myproc.o ⽂件。(这有点像⼀个堆栈的过程)
5.make会一层又一层地去找文件的依赖关系,直到编译出一个第一个目标文件
6.如果寻找的过程中出现错误,例如最终依赖的目标文件没被找到,meke就会直接退出并报错。
5.Linux第一个系统程序-进度条
5.1 回车与换行
回车:回到当前行的开始
换行:换到另外一行的开始
回车的指令是\r
换行的指令是\n
5.2 缓冲区
缓冲区是一段内存块
代码是从上往下执行的,printf比sleep先执行。当printf在没有\n的情况下执行后,并没有显示hello bit这个内容,而是在3s后才显示,在这3s内hello bit是在缓冲区里面当程序退出就会刷新缓冲区从而显示hello bit。而有了\n就会先sleep再printf。
如果想要快点刷新缓冲区可以使用fflush(stdout) .
5.3 倒计时程序
6.版本控制器Git
6.1 版本控制器
文件有不同的版本,随着版本的增多,可能会存在忘记的情况,那么为了更加方便管理这些不同的版本,便有了版本控制器。版本控制器可以 记录工程的每一次改动和版本迭代的一个管理系统,同时也方便多人协同作业。
Git是目前主流的版本控制器,它可以控制电脑上所有格式的文件,但Git的作用中最重要的就是可以帮助我们管理软件开发项目中的源代码文件。
6.2 对Git的理解
Git 说白了就是一种版本控制器的软件,在软件内可以进行功能的使用,即在软件内创建多种仓库,为了达到数据安全以及协作开发,又在云服务器内与git内的仓库相连,建立了远端仓库,在gitee和github(这二者是基于git的网站或者平台)上登录注册便可以使用远端仓库。
6.3 安装git
apt install git
6.4在Linux上连接gitee上创建的仓库
记住这个链接然后在linux中输入
便可以连接上在gitee里的仓库
6.5 三板斧
注意: git提交的时候,只会提交变化的部分
1.git add
将文件放到git的缓冲区中
git add[文件名]
2.git commit
将缓冲区的文件放到git的仓库里面
git commit -m "XXX”
后面的XXX是描述改动的详细内容
上图的详细内容就是新增两个文件
3.git push
同步到远端服务器上(即同步到gitee上)
git push
gitee上的远端仓库不仅可以同步到git上,同时也能同步到windows上,过程这里就不再复现了,有需要的可以自己去了解。
7.调试器 -gdb/cgdb的使用
7.1 认识gdb
gdb是GNU开源组织发布的一个强大的Unix/Linux下的程序调试工具,主要功能是启动和控制程序执行,检查程序状态,修改变量和程序执行流程等
7.2 预备
程序的发布方式有两种,分别是debug模式和release模式,Linux gcc/g++出来的二进制程序,默认是release模式
要使用gdb进行调试,必须在源代码生成二进制文件的时候加上-g选项。
7.3 gdb的基本使用过程
7.3.1 样例代码
myprocess.c
#include <stdio.h>
int Sum(int s, int e)
{
int result = 0;
for(int i = s; i <= e; i++)
{
result += i;
}
return result;
}
int main()
{
int start = 1;
int end = 100;
printf("I will begin\n");
int n = Sum(start, end);
printf("running done, result is: [%d-%d]=%d\n", start, end, n);
return 0;
}
7.3.2 进入gdb使用状态具体过程
首先让样例代码生成二进制程序的时候加上-g让其处于可调试状态
接着可以./myprocess运行代码看是否有问题
然后gdb myprocess进入调试状态
7.3.3 常见的使用功能
7.4常见技巧
7.4.1 cgdb
cgbd与gdb功能类似,但与gdb相比其使用起来更加方便,上面是release,下面是debug.
7.4.2 watch
执行时监视一个表达式的值,如果监视的表达式在程序运行期间的值发生变化,gdb会暂停程序的执行,并通知使用者。
注意:如果有一些变量不应该修改,可以用watch该变量,如果变化了,watch就会通知你
7.4.3 条件断点
条件断点添加的常用两种方式:
1.新增
2.给已有断点追加
新增:b行号/文件名:行号/函数名 if i==30 (条件)
给已有断点追加: condition 2 i==30,其中2是已有断点编号,没有if.