WHCSRL 技术网

Linux-(二)环境基础开发工具(yum、vim、gcc、gdb、makefile、git)

总述

  • yum:软件包管理工具,完成第三方工具软件的安装卸载功能
  • vim:编辑器,路奴性写代码的工具
  • g++/gcc:编译器,将高级语言进行编译成及其指令
  • gdb:调试器,调试程序的运行过程
  • make:就是 “makefile“ 项目的自动化构建工具
  • git:项目的版本管理工具

1. yum:软件包管理工具

1.1 软件包是什么?

  • 在linux下安装软件,通常办法是下载程序源代码,并进行编译,最后得到可执行程序。这样就比较麻烦了,于是有人把一些常用的软件提前编译好,做成软件包(就像是Windows上的安装程序)放在一个服务器上,通过包管理器很方便的获取到这个编译好的软件包,可以直接进行安装。
  • 软件包和软件包管理器就和“app"和”应用商店“一样。
  • yum(Yellow dog Updater,Modified)是linux下非常常用的一种包管理器。

1.2 软件包的操作

1.2.1 查看

  • 命令:yum list
  • 功能:查看当前一共有哪些软件包
  • 注意:由于包的数目可能非常多,我们可以使用 yum search vim 命令只筛选出我们需要要的(这里用vim举例)

1.2.2 安装

  • 命令:yum install filename
  • 功能:安装软件
  • 注意:要在具有 root 权限的情况下执行命令。如:sudo yum install lrzsz

1.2.3 卸载

  • 命令:yum remove filename
  • 功能:卸载软件
  • 注意:要在具有 root 权限的情况下执行命令。如:sudo yum remove lrzsz

2. vim:linux编辑器

2.1 vim基本概念

2.1.1 什么是vim?

vim 是编辑器,用于编辑文本,编写代码的工具。因为 vim 的操作是在命令行中,不支持鼠标,因此光标的移动,文本内容的操作都需要命令来完成。因为 vim 是编辑器,所有有HIA具备插入数据的功能,因此 vim 为了实现命令操作和数据插入操作互不干扰,设计了多种操作模式。

2.2.2 vim 操作模式

  • 共有12种操作模式,常见的有三种:
  • 普通模式(Normal mode):
    执行对文本内容进行操作的指令。控制屏幕光标的移动,字符,字或行的删除,模式切换。
  • 插入模式(Insert mode):
    文本数据的写入。模式切换
  • 底行模式(last line mode):
    文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。
  • 模式切换
  • 普通模式—>插入模式:i a o I A O
  • 普通模式—>底行模式:英文冒号
  • 其他模式—>普通模式:esc

2.2 vim基本操作

2.2.1 底行模式下常见操作

保存或者退出编辑

  • :w 保存
  • :q 退出
  • :wq 保存并退出
  • :q! 强制退出不保存
  • /string 匹配字符串
  • ?string 匹配字符串

2.2.2 普通模式下常见操作

  1. 模式切换
  • [ i ]:进入插入模式后,从光标当前位置开始输入文字
  • [ a ]:进入插入模式后,从目前光标所在位置的下一个位置开始输入文字
  • [ o ]:进入插入模式后,从目前光标位置的下一行,从行首开始输入文字
  • [ ESC ]:从插入模式切换为普通模式
  1. 移动光标
  • [ h ] [ j ] [ k ] [ l ] :上下左右
  • [ Ctrl ] + [ f ]:屏幕往上移动一页
  • [ Ctrl ] + [ f ]:屏幕往下移动一页
  • [ gg ]:光标移动到文本的开始
  • [ G ]:光标移动到文本的最后
  1. 删除
  • [ dd ]:删除光标所在行
  • [ ndd ]:从光标所在行开始删除 n 行
  • [ x ]:每按一次,删除光标所在位置的一个字符
  • [ dw ]:删除光标所在单词
  1. 复制粘贴
  • [ yy ]:复制光标所在行到缓存区
  • [ nyy ]:复制从光标位置开始的 n 行文字
  • [ p ]:将缓存区内的字符粘贴到光标所在位置。注意:所有与“ y "有关的复制命令都必须和“ p ”命令配合才能完成复制粘贴。
  1. 撤销和撤销还原
  • [ u ]:撤销上一次操作
  • [ Ctrl ] + [ r ]:撤销的还原
  1. 全文对齐
  • [ gg = G ]
  1. 替换
    1-12行的指定字符串替换
    :1,12s/printf/scanf/g

2.3 注意

  • 刚使用特别容易遇到的错误。在vim中编辑的时候不小心没保存就退出 了(比如我就是不小心按了Ctrl+z),然后你在之后每次再打开这个文件的时候会一直提示如下错误信息:
    在这里插入图片描述
  • 解决办法:
    (1)记下你的 .swp 文件的存储位置
    (2)输入 r —>在正常保存后退出 :wq
    (3)去你记住的 .swp 文件位置删除这个文件。问题就解决了

3. gcc/g++编译器

3.1 功能

将我们所写的高级语言代码编译解释成机器指令

3.2 编译过程

  • 预处理:展开所有代码(引入头文件,宏替换,删除注释…)
  • 编译:语法语义检测,没有错误则将代码解释成为汇编指令
  • 汇编:架构汇编指令解释成二进制机器指令
  • 链接:将所需的二进制机器指令(其他的.o以及库文件)打包生成可执行文件

3.3 gcc 常见选项:

  • -E 只进行到预处理完成
  • -S 只进行到编译完成
  • -c 只进行到汇编完成
  • -o 指定要生成的目标文件对象名称
  • -g 告诉编译器不要生成release版本在 -c 时就要加上-g

3.4 选项举例

  • gcc -E main.c -o main.i
  • gcc -S main.i -o main.s
  • gcc -c main.s -o main.o
  • (gcc -g -c main.s -o main.o)
  • gcc main.o -o main
  • 此时 main 就是一个可执行文件了,可以输入 ./main 指令执行main文件。(其实就是告诉shell文件 main 文件在哪里 ,所以这里意思是main在当前目录下)。

3.5 其他概念

  • 链接:将所有的机器指令(多个.o文件以及使用的库代码)打包生成可执行程序
  • .o:我们自己的 .c 文件生成的机器指令文件
  • 库文件:大佬们针对典型的常用函数,提前写好的打包好的机器指令文件
  • 链接库文件:就是将库中使用到的函数的实现拿过来用。分为动态链接(在我们可执行程序中记录库中函数符号信息表,并没有把具体实现的指令写入可执行程序,而是在运行的时候去加载这个库。优缺点:生成的程序小,在内存中共享库,但是运行时依赖库的存在)和静态链接(将库中使用到的代码写入到可执行程序中。优缺点:生成的程序较大,运行时不需要依赖库,但是会存在运行时内存中存在重复冗余代码)
  • gcc默认链接方式:动态链接。

4 gdb:调试器

4.1 什么是调试器

  • 用来调试程序的运行过程。编译器只能发现语法错误,无法发现程序的运行错误(奔溃、逻辑异常)。
  • 程序调试的前提:这个程序是一个debug版本的程序
  • debug程序:不进行代码优化,并且会加入调试信息
  • release程序:会进行代码优化,提高程序运行效率,无法调试
  • gcc编译器默认生成release版本程序——无法进行调试
  • gcc -g 选项,生成debug调试程序: gcc -g main.c -o main

4.2 常见调试指令

4.2.1 开始调试

  • run:直接运行
    在这里插入图片描述

  • start:逐步调试
    在这里插入图片描述

4.2.2 流程控制

  • list
    查看文件附近代码,可以查看指定文件指定行代码的附近代码,例如:list child.c:5
    在这里插入图片描述

  • n/next
    下一步——逐过程(遇到函数直接运行完毕)
    在这里插入图片描述

  • s/step
    下一行——逐语句(遇到函数,进入函数,继续逐语句进行调试)
    在这里插入图片描述

  • until
    运行指定文件指定行,例如 until main.c:18
    在这里插入图片描述

  • 断点相关

  • 打断点 :b/break
    例如给指定文件指定行打断点: b/break main.c:8。
    在这里插入图片描述
    给指定函数打断点,例如:b/break test_func。
    在这里插入图片描述

  • 查看断点信息:info break / i b
    在这里插入图片描述

  • 删除断点:d/delete break_id
    在这里插入图片描述

  • watch:给变量打一个监控断点,变量发生变化的时候触发断点
    在这里插入图片描述

  • 打印

  • print:查看/设置变量数据

  • p/print 变量:打印变量的值
    在这里插入图片描述

  • c/continue:从调试位置开始不再逐步调试而是向下运行
    在这里插入图片描述

  • backtrace:查看函数调用栈,快速找到程序奔溃位置。栈顶函数就是导致程序奔溃的函数
    在这里插入图片描述

  • 程序是运行参数是在gdb加载成之后,run/start 的时候给与
    gdb ./main
    run -l -a…

5. make/makefile:项目自动化构建工具

  • Makefile是一个文本文件,在其中编写项目的构建规则。
  • make是一个Makefile的解释程序,在当前目录下找到名为Makefile的文件进行逐行解释。

5.1 makefile是什么

  • 一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,Makefile文件定义了其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。

  • makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

5.2 make是什么

  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
  • make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

5.3 makefile 编写规则

  • 例子
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 目标对象:依赖对象

  • [ tab ]为了生成目标对象所需要执行的命令

  • 预定义变量:
    $@:目标对象
    $^:所有依赖对象
    $<:依赖对象的第一个

5.4 make解释执行规则:

  • make生成第一个目标对象后就会退出。
  • 为了生成目标对象,递归先查找依赖对象的生成规则,生成依赖对象之后在生成目标对象
  • .PHONY:总是要生成的对象(与外部文件脱离的文件)

5.5 makefile文件

在这里插入图片描述
在这里插入图片描述

6. git :项目的版本管理工具

6.1 功能

  • 将项目的每个节点版本保存起来,以便于随时能够回滚还原。
  • 协同开发

6.2 操作

  1. 克隆远程仓库:git clone https://gitte.com/qigezi/class_94.git
  2. 添加修改记录:git add --all ./
  3. 提交本地仓库:git commi -m “备注信息”(时间 XXX 对XXX 文件 做了 XXX 修改)
  4. 同步远程仓库:git push origin master

6.3 举例

  1. 在gitee 创建一个仓库
    复制的仓库的路径 https 的
    在这里插入图片描述
  2. 克隆远程仓库
    在linux下输入下面指令(把在仓库复制的指令粘贴进来) :
    git clone https://gitee.com/yxydcode/linux_git_use.git
    在这里插入图片描述
  3. 添加修改记录:git add --all ./
    输入指令:git add --all ./
    在这里插入图片描述
    在这里插入图片描述
  4. 提交本地仓库:git commi -m “备注信息”
    输入指令:git commit -m “2021.10.17 yxy 添加了 main.c 文件”
    在这里插入图片描述
  5. 同步远程仓库:git push origin master
    在这里插入图片描述
推荐阅读