Linux开发工具

Linux开发工具

  • 前序
  • Linux编辑器-vim使用
    • vim的基本概念
    • vim的基本操作
    • vim正常模式命令集
    • vim行末模式命令集
  • Linux编译器-gcc/g++使用
    • 背景知识
    • gcc编译过程
      • 预处理(进行宏替换)
      • 编译(生成汇编)
      • 汇编(生成机器可识别代码)
      • 链接(生成可执行文件或库文件)
    • gcc选项
  • Linux项目自动化构建工具-make/makefile
    • 理解
    • 依赖关系
    • 依赖方法
    • 清理
  • Linux调试器-gdb使用
    • 背景
    • 开始使用

前序

这一章节学习Linux开发工具,什么是工具呢?在日常生活中工具是用来帮助解决问题的,例如,切菜用到的刀;用来喝水的杯子…

在这里工具其实是指令

生活中
如果自己想要安装某一款软件,需要先下载软件包(连网状态);软件包肯定不是在自己的手机或者电脑上面,如果是,下载岂不是多次一举,所以,软件包是在远端服务器上,或者云服务器上;既然知道软件包在服务器上,但到底在哪一台服务器上呢?如果是电脑,在官网里面搜索即可,如果是手机,在应用商店里搜索即可。

Linux客户端
在Linux中下载软件与上面类似,首先软件本身是开源,一起打包放在开源软件对应的服务器中;下载时,在Linux中寻找内置服务器中对应的下载链接也就是yum

Linux编辑器-vim使用

vim的基本概念

Linux开发工具_第1张图片

  1. 命令模式
    控制屏幕光标的移动,字符,字或行的删除,移动复制某区段及进入insert mode下,或者到last line mode
  2. 插入模式
    只有在insert mode下,才可以做文字输入,按Esc键可回到命令行模式
  3. 末行模式
    文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作;在命令模式,shift+;即可进入该模式

vim的基本操作

  1. 进入vim,在系统提示符号输入vim及文件名称后,便可进入vim全屏幕编辑画面;进入vim之后,是处于正常模式,只有切换到插入模式才能输入文字
    Linux开发工具_第2张图片

  2. 正常模式切换插入模式

输入 a
输入 i
输入 o
  1. 插入模式切换正常模式
    处于插入模式,就只能一直输入文字;按Esc键即可退出插入模式转到正常模式

  2. 正常模式切换末行模式
    shift+;也就是输入:

  3. 退出vim及保存文件,在正常模式下,先切换到末行模式

:w 保存当前文件
:wq 输入wq,保存并退出vim
:q! 输入q! 不保存强制退出vim

vim正常模式命令集

  1. 插入模式
    [i]切换进入插入模式,按i进入插入模式后是从光标当前位置开始输入文件
    [a]进入插入模式后,是从当前光标所在位置的下一个位置开始输入文件
    [o]进入插入模式后,是插入新的一行,从行首开始输入文字
  2. 从插入模式切换命令模式
    [Esc]
  3. 移动光标
    vim可以直接在键盘上的光标上下左右移动,规定下vim是用小写英文字母[h],[j],[k],[l],分别控制光标左,下,上,右移动一格
    [G]:移动到文章的最后
    [$]:移动到光标所在行的行尾
    [^]:移动到光标所在行的行首
    [w]:光标跳到下个字的开头
    [e]:光标跳到下个字的字尾
    [b]:光标回到上个字的开头
    [#l]:光标移动到该行的第#个位置
    [gg]:进入到文本开始
    [shift+g]:进入文本末端
    [ctrl]+[b]:屏幕往后移动一页
    [ctrl]+[f]:屏幕往前移动一页
    [ctrl]+[u]:屏幕往后移动半页
    [ctrl]+[d]:屏幕往前移动半页
  4. 删除文字
    x:每按一次,删除光标所在位置的一个字符
    [#x]:删除光标所在位置后的#个字符
    [X]:每按一次,删除光标所在位置前面的一个字符
    [#X]:表示删除光标所在位置前面的#个字符
    [dd]:删除光标所在行
    [#dd]:从光标所在行开始删除#行
  5. 复制
    [yw]:将光标所在之处到字尾的字符复制到缓冲区
    [#yw]:复制#个字符到缓冲区
    [yy]:复制光标所在行到缓冲区
    [#yy]:拷贝从光标所在行及下面#行
    [p]:将缓冲区内的字符贴到光标所在位置
    所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能
  6. 替换
    [r]:替换光标所在处的字符
    [R]:一直替换光标所在处的字符,直到按下[Esc]键为止
  7. 撤销上一次操作
    [u]:如果误操作一个命令,可以按下[u],回到上一个操作;按多次[u]可以执行多次撤销
  8. 更改
    [cw]:更改光标所在处的字到字尾
    [c#w]:更改#个字符
  9. 跳至指定的行
    [ctrl]+[g]:列出光标所在行的行号
    [#G]:表示移动到光标至文章的第#行行首

vim行末模式命令集

在使用末行模式之前,先按[Esc]键确保处于正常模式,再按[:]冒号即可进入末行模式

  1. 列出行号
    [set nu]:输入[set nu]后,会在文件的每行前面列出行号
  2. 跳到文件中的某一行
    [#][#]表示一个数字,在冒号后面输入一个数字,再按回车便会跳到该行
  3. 查找字符
    [/关键字]:先按[/],再输入待查找的字符,如果第一次找到的关键字不是想要的,一直按[n]会往后寻找待查找的关键字直到找到为止
    [?关键字]:先按[?],再输入待查找的字符,如果第一次找到的关键字不是想要的,一直按[n]会往前寻找待查找的关键字直到找到为止
  4. 保存文件
    [w]:在冒号后输入字母[w]便可以将文件保存起来
  5. 离开vim
    [q]:退出,如果无法退出,在后面加上[!]强制离开vim
    [wq]:保存文件并退出

Linux编译器-gcc/g++使用

背景知识

编译器进行代码编译的四个步骤

  1. 预处理(进行宏替换)
  2. 编译(生成汇编)
  3. 汇编(生成机器可识别代码)
  4. 链接(生成可执行文件)

gcc编译过程

格式

gcc[选项]  待编译的文件 [选项][目标文件]

预处理(进行宏替换)

预处理功能主要包括宏定义,文件包含,条件编译,预处理指令是以#号开头的代码行

Linux开发工具_第3张图片

选项-E,作用是使gcc在预处理结束后停止编译过程
选项-o,是指目标文件
test.i是预处理之后生成的C原始程序

编译(生成汇编)

gcc检查代码的规范性,是否存在语法错误,检查无误后,gcc将代码翻译成汇编语言

Linux开发工具_第4张图片

通过 选项-S进行查看,该选项只进行编译不进行汇编,最后生成汇编语言
test.s是编译之后生成的汇编代码

汇编(生成机器可识别代码)

将编译阶段生成的.s文件转化成目标文件
Linux开发工具_第5张图片

通过选项-c可以将汇编代码转化为.o的二进制目标代码
test.o是已经转化之后的二进制目标代码

链接(生成可执行文件或库文件)

Linux开发工具_第6张图片

动态链接与静态链接
首先需要了解的是链接的本质:调用库函数时,实质上是在调用标准库

标准库分为两种:静态库,动态库

Linux下库的命名规则
动态库:libXXX.so;静态库:libYYY.a
去掉前缀lib,去掉后缀.so/.a便是库名称

动态库在编译链接时并没有将库文件的代码加载到可执行文件中,而是在程序执行时由运行时链接文件加载到库中,可以减少内存的开销;动态库的后缀一般是.so

gcc在编译时,默认使用动态库,完成链接之后便会生成可执行文件

Linux开发工具_第7张图片

静态库是指编译链接时,把库文件的代码全部加载到可执行文件中,生成的文件也就比较大,但也较为方便,其后缀名一般是.a

Linux开发工具_第8张图片

gcc选项

-E 激活预处理,不生成文件
-S 编译到汇编语言不进行汇编和链接
-c 编译成目标代码
-o 指明形成的临时文件名称
-static 用于静态链接

Linux项目自动化构建工具-make/makefile

理解

make是命令;makefile是文件
makefile的目的是为了构建项目,makefile优点是自动化编译,一旦写好,只需要make命令,整个工程便会自动编译,极大地提高效率。但需要两方面:依赖关系依赖方法

 #include
 int main()
 {
    printf("hello makefile\n");                                                                                                                                             
    return 0;
 }

在这里插入图片描述

Linux开发工具_第9张图片

通过make命令直接生成可执行程序code

依赖关系

code文件的生成依赖于 code.c文件

依赖方法

gcc code.c -o code

通过gcc生成 code可执行文件

清理

Linux开发工具_第10张图片

Linux开发工具_第11张图片

.PHONY修饰的对象可以一直被执行
观察下列命令
Linux开发工具_第12张图片
make命令执行一次之后,再执行第二次时,程序报出此文件已是最新的,什么意思呢???而且为什么删除指令make clean为什么可以多次进行,而不会报出任何问题问题呢???想要解决这些问题,需要先了解文件的属性

Linux开发工具_第13张图片

由上图可以看到ModifyChange都是表示文件的时间,到底那个是表示修改属性时间,那个内容修改时间呢?下面一起来测试一下

Linux开发工具_第14张图片

通过修改文件所有者的属性,观察到Change表示的时间发生了变化,所以:Change表示的是修改属性的时间,Modify表示的是修改内容的时间,还需要注意的是,修改文件内容一定会修改属性的,因为文件的大小也是属性,故Modify的时间发生变化,Change的时间也一定会变化,这里讨论的便是Modify表示的时间

现在回到正题,既然提到时间,那就根据时间这个信息去解决上面的问题
Linux开发工具_第15张图片
源文件的生成时间肯定比生成的可执行程序的时间要早,上面也符合这个,所以当再一次进行make指令时,报出已是最新,指的应该是生成的可执行程序的时间并没有改变,还是晚于源文件。可以猜测:是不是当源文件的时间比可执行程序的时间新时,便可再次进行make指令呢???

接下来进行验证
Linux开发工具_第16张图片
当对源文件进行重命名之后,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  结束函数运行   

你可能感兴趣的:(linux,vim,运维)