这一章节学习Linux开发工具,什么是工具呢?在日常生活中工具是用来帮助解决问题的,例如,切菜用到的刀;用来喝水的杯子…
在这里工具其实是指令
生活中
如果自己想要安装某一款软件,需要先下载软件包(连网状态);软件包肯定不是在自己的手机或者电脑上面,如果是,下载岂不是多次一举,所以,软件包是在远端服务器上,或者云服务器上;既然知道软件包在服务器上,但到底在哪一台服务器上呢?如果是电脑,在官网里面搜索即可,如果是手机,在应用商店里搜索即可。
Linux客户端
在Linux中下载软件与上面类似,首先软件本身是开源,一起打包放在开源软件对应的服务器中;下载时,在Linux中寻找内置服务器中对应的下载链接也就是yum
Esc
键可回到命令行模式shift+;
即可进入该模式输入 a
输入 i
输入 o
插入模式切换正常模式
处于插入模式,就只能一直输入文字;按Esc
键即可退出插入模式转到正常模式
正常模式切换末行模式
shift+;
也就是输入:
退出vim及保存文件,在正常模式下,先切换到末行模式
:w 保存当前文件
:wq 输入wq,保存并退出vim
:q! 输入q! 不保存强制退出vim
[i]
切换进入插入模式,按i
进入插入模式后是从光标当前位置开始输入文件[a]
进入插入模式后,是从当前光标所在位置的下一个位置开始输入文件[o]
进入插入模式后,是插入新的一行,从行首开始输入文字[Esc]
键[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]
:将缓冲区内的字符贴到光标所在位置[r]
:替换光标所在处的字符[R]
:一直替换光标所在处的字符,直到按下[Esc]
键为止[u]
:如果误操作一个命令,可以按下[u]
,回到上一个操作;按多次[u]
可以执行多次撤销[cw]
:更改光标所在处的字到字尾[c#w]
:更改#个字符[ctrl]+[g]
:列出光标所在行的行号[#G]
:表示移动到光标至文章的第#行行首在使用末行模式之前,先按[Esc]
键确保处于正常模式,再按[:]
冒号即可进入末行模式
[set nu]
:输入[set nu]
后,会在文件的每行前面列出行号[#]
:[#]
表示一个数字,在冒号后面输入一个数字,再按回车便会跳到该行[/关键字]
:先按[/]
,再输入待查找的字符,如果第一次找到的关键字不是想要的,一直按[n]
会往后寻找待查找的关键字直到找到为止[?关键字]
:先按[?]
,再输入待查找的字符,如果第一次找到的关键字不是想要的,一直按[n]
会往前寻找待查找的关键字直到找到为止[w]
:在冒号后输入字母[w]
便可以将文件保存起来[q]
:退出,如果无法退出,在后面加上[!]
强制离开vim[wq]
:保存文件并退出编译器进行代码编译的四个步骤
格式:
gcc[选项] 待编译的文件 [选项][目标文件]
预处理功能主要包括宏定义,文件包含,条件编译,预处理指令是以#
号开头的代码行
选项-E
,作用是使gcc在预处理结束后停止编译过程
选项-o
,是指目标文件
test.i
是预处理之后生成的C原始程序
gcc检查代码的规范性,是否存在语法错误,检查无误后,gcc将代码翻译成汇编语言
通过 选项-S
进行查看,该选项只进行编译不进行汇编,最后生成汇编语言
test.s
是编译之后生成的汇编代码
通过选项-c
可以将汇编代码转化为.o
的二进制目标代码
test.o
是已经转化之后的二进制目标代码
动态链接与静态链接
首先需要了解的是链接的本质:调用库函数时,实质上是在调用标准库
标准库分为两种:静态库,动态库
Linux下库的命名规则
动态库:libXXX.so
;静态库:libYYY.a
去掉前缀lib
,去掉后缀.so/.a
便是库名称
动态库在编译链接时并没有将库文件的代码加载到可执行文件中,而是在程序执行时由运行时链接文件加载到库中,可以减少内存的开销;动态库的后缀一般是.so
gcc在编译时,默认使用动态库,完成链接之后便会生成可执行文件
静态库是指编译链接时,把库文件的代码全部加载到可执行文件中,生成的文件也就比较大,但也较为方便,其后缀名一般是.a
-E 激活预处理,不生成文件
-S 编译到汇编语言不进行汇编和链接
-c 编译成目标代码
-o 指明形成的临时文件名称
-static 用于静态链接
make是命令;makefile是文件
makefile的目的是为了构建项目,makefile优点是自动化编译,一旦写好,只需要make命令,整个工程便会自动编译,极大地提高效率。但需要两方面:依赖关系,依赖方法
#include
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中通过gcc生成的可执行程序,默认是release版本。也就是不可以进行调试,只有在源代码生成可执行程序时,在makefile中加入后缀-g
,生成的便是可调试版本(debug)。两个版本下大小也是有所区别的,debug版本下加入了可调式信息,大小自然也就相对大些
断点
打断点 b 行号 形成编号
查断点 info b 观察断点
去断点 d 编号 使用编号
运行
调试运行 r
逐过程 n
逐语句 s
运行至下个断点 c
监视
display/undisplay 显示变量
until 调试至指定行
bt 查看调用堆栈
finish 结束函数运行