前序
这一章节学习Linux开发工具,什么是工具呢?在日常生活中工具是用来帮助解决问题的,例如,切菜用到的刀;用来喝水的杯子…
在这里工具其实是指令
生活中
如果自己想要安装某一款软件,需要先下载软件包(连网状态);软件包肯定不是在自己的手机或者电脑上面,如果是,下载岂不是多次一举,所以,软件包是在远端服务器上,或者云服务器上;既然知道软件包在服务器上,但到底在哪一台服务器上呢?如果是电脑,在官网里面搜索即可,如果是手机,在应用商店里搜索即可。
Linux客户端
在Linux中下载软件与上面类似,首先软件本身是开源,一起打包放在开源软件对应的服务器中;下载时,在Linux中寻找内置服务器中对应的下载链接也就是yum
Linux编辑器-vim使用
vim的基本概念
命令模式
控制屏幕光标的移动,字符,字或行的删除,移动复制某区段及进入insert mode下,或者到last line mode
插入模式
只有在insert mode下,才可以做文字输入,按Esc键可回到命令行模式
末行模式
文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作;在命令模式,shift+;即可进入该模式
vim的基本操作
进入vim,在系统提示符号输入vim及文件名称后,便可进入vim全屏幕编辑画面;进入vim之后,是处于正常模式,只有切换到插入模式才能输入文字
正常模式切换插入模式
输入 a 输入 i 输入 o
插入模式切换正常模式
处于插入模式,就只能一直输入文字;按Esc键即可退出插入模式转到正常模式
正常模式切换末行模式
shift+;也就是输入:
退出vim及保存文件,在正常模式下,先切换到末行模式
:w 保存当前文件 :wq 输入wq,保存并退出vim :q! 输入q! 不保存强制退出vim
vim正常模式命令集
插入模式
按[i]切换进入插入模式,按i进入插入模式后是从光标当前位置开始输入文件
按[a]进入插入模式后,是从当前光标所在位置的下一个位置开始输入文件
按[o]进入插入模式后,是插入新的一行,从行首开始输入文字
从插入模式切换命令模式
按[Esc]键
移动光标
vim可以直接在键盘上的光标上下左右移动,规定下vim是用小写英文字母[h],[j],[k],[l],分别控制光标左,下,上,右移动一格
按[G]:移动到文章的最后
按[$]:移动到光标所在行的行尾
按[^]:移动到光标所在行的行首
按[w]:光标跳到下个字的开头
按[e]:光标跳到下个字的字尾
按[b]:光标回到上个字的开头
按[#l]:光标移动到该行的第#个位置
按[gg]:进入到文本开始
按[shift+g]:进入文本末端
按[ctrl]+[b]:屏幕往后移动一页
按[ctrl]+[f]:屏幕往前移动一页
按[ctrl]+[u]:屏幕往后移动半页
按[ctrl]+[d]:屏幕往前移动半页
删除文字
x:每按一次,删除光标所在位置的一个字符
[#x]:删除光标所在位置后的#个字符
[X]:每按一次,删除光标所在位置前面的一个字符
[#X]:表示删除光标所在位置前面的#个字符
[dd]:删除光标所在行
[#dd]:从光标所在行开始删除#行
复制
[yw]:将光标所在之处到字尾的字符复制到缓冲区
[#yw]:复制#个字符到缓冲区
[yy]:复制光标所在行到缓冲区
[#yy]:拷贝从光标所在行及下面#行
[p]:将缓冲区内的字符贴到光标所在位置
所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能
替换
[r]:替换光标所在处的字符
[R]:一直替换光标所在处的字符,直到按下[Esc]键为止
撤销上一次操作
[u]:如果误操作一个命令,可以按下[u],回到上一个操作;按多次[u]可以执行多次撤销
更改
[cw]:更改光标所在处的字到字尾
[c#w]:更改#个字符
跳至指定的行
[ctrl]+[g]:列出光标所在行的行号
[#G]:表示移动到光标至文章的第#行行首
vim行末模式命令集
在使用末行模式之前,先按[Esc]键确保处于正常模式,再按[:]冒号即可进入末行模式
列出行号
[set nu]:输入[set nu]后,会在文件的每行前面列出行号
跳到文件中的某一行
[#]:[#]表示一个数字,在冒号后面输入一个数字,再按回车便会跳到该行
查找字符
[/关键字]:先按[/],再输入待查找的字符,如果第一次找到的关键字不是想要的,一直按[n]会往后寻找待查找的关键字直到找到为止
[?关键字]:先按[?],再输入待查找的字符,如果第一次找到的关键字不是想要的,一直按[n]会往前寻找待查找的关键字直到找到为止
保存文件
[w]:在冒号后输入字母[w]便可以将文件保存起来
离开vim
[q]:退出,如果无法退出,在后面加上[!]强制离开vim
[wq]:保存文件并退出
Linux编译器-gcc/g++使用
背景知识
编译器进行代码编译的四个步骤
- 预处理(进行宏替换)
- 编译(生成汇编)
- 汇编(生成机器可识别代码)
- 链接(生成可执行文件)
gcc编译过程
格式:
gcc[选项] 待编译的文件 [选项][目标文件]
预处理(进行宏替换)
预处理功能主要包括宏定义,文件包含,条件编译,预处理指令是以#号开头的代码行
选项-E,作用是使gcc在预处理结束后停止编译过程
选项-o,是指目标文件
test.i是预处理之后生成的C原始程序
编译(生成汇编)
gcc检查代码的规范性,是否存在语法错误,检查无误后,gcc将代码翻译成汇编语言
通过 选项-S进行查看,该选项只进行编译不进行汇编,最后生成汇编语言
test.s是编译之后生成的汇编代码
汇编(生成机器可识别代码)
将编译阶段生成的.s文件转化成目标文件
通过选项-c可以将汇编代码转化为.o的二进制目标代码
test.o是已经转化之后的二进制目标代码
链接(生成可执行文件或库文件)
动态链接与静态链接
首先需要了解的是链接的本质:调用库函数时,实质上是在调用标准库
标准库分为两种:静态库,动态库
Linux下库的命名规则
动态库:libXXX.so;静态库:libYYY.a
去掉前缀lib,去掉后缀.so/.a便是库名称
动态库在编译链接时并没有将库文件的代码加载到可执行文件中,而是在程序执行时由运行时链接文件加载到库中,可以减少内存的开销;动态库的后缀一般是.so
gcc在编译时,默认使用动态库,完成链接之后便会生成可执行文件
静态库是指编译链接时,把库文件的代码全部加载到可执行文件中,生成的文件也就比较大,但也较为方便,其后缀名一般是.a
gcc选项
-E 激活预处理,不生成文件 -S 编译到汇编语言不进行汇编和链接 -c 编译成目标代码 -o 指明形成的临时文件名称 -static 用于静态链接
Linux项目自动化构建工具-make/makefile
理解
make是命令;makefile是文件
makefile的目的是为了构建项目,makefile优点是自动化编译,一旦写好,只需要make命令,整个工程便会自动编译,极大地提高效率。但需要两方面:依赖关系,依赖方法
#include<stdio.h> int main() { printf("hello makefile\n"); return 0; }
通过make命令直接生成可执行程序code
依赖关系
code文件的生成依赖于 code.c文件
依赖方法
gcc code.c -o code
通过gcc生成 code可执行文件
清理
.PHONY修饰的对象可以一直被执行
观察下列命令
当make命令执行一次之后,再执行第二次时,程序报出此文件已是最新的,什么意思呢???而且为什么删除指令make clean为什么可以多次进行,而不会报出任何问题问题呢???想要解决这些问题,需要先了解文件的属性
由上图可以看到Modify,Change都是表示文件的时间,到底那个是表示修改属性时间,那个内容修改时间呢?下面一起来测试一下
通过修改文件所有者的属性,观察到Change表示的时间发生了变化,所以:Change表示的是修改属性的时间,Modify表示的是修改内容的时间,还需要注意的是,修改文件内容一定会修改属性的,因为文件的大小也是属性,故Modify的时间发生变化,Change的时间也一定会变化,这里讨论的便是Modify表示的时间
现在回到正题,既然提到时间,那就根据时间这个信息去解决上面的问题
源文件的生成时间肯定比生成的可执行程序的时间要早,上面也符合这个,所以当再一次进行make指令时,报出已是最新,指的应该是生成的可执行程序的时间并没有改变,还是晚于源文件。可以猜测:是不是当源文件的时间比可执行程序的时间新时,便可再次进行make指令呢???
接下来进行验证
当对源文件进行重命名之后,Modify的时间发生了变化,导致源文件的时间比可执行程序的时间新,所以make指令便可重新执行
clean是被.PHONY所修饰的,之所以可以一直被执行,是因为被.PHONY所修饰的命令,不关注任何时间,直接无脑执行即可,至此,上面的问题已经完全解决
Linux调试器-gdb使用
背景
在Linux中通过gcc生成的可执行程序,默认是release版本。也就是不可以进行调试,只有在源代码生成可执行程序时,在makefile中加入后缀-g,生成的便是可调试版本(debug)。两个版本下大小也是有所区别的,debug版本下加入了可调式信息,大小自然也就相对大些
开始使用
断点
打断点 b 行号 形成编号 查断点 info b 观察断点 去断点 d 编号 使用编号
运行
调试运行 r 逐过程 n 逐语句 s 运行至下个断点 c
监视
display/undisplay 显示变量 until 调试至指定行 bt 查看调用堆栈 finish 结束函数运行