目录
1.yum —— 软件包管理工具
—— 安装其他软件的工具(redhat 系列linux的软件包管理工具)
yum—— linux中默认的管理工具,提供软件包的查看,安装,移除等操作
三板斧操作:
查看:
- yum list —— 查看所有可安装的软件包
- yum list installed —— 查看已经安装的软件包
- yum search —— 搜索指定软件包
示例:yum search lrzsz
- yum makecache —— 将软件包信息保存到本地
安装:
- yum install —— 安装软件包(安装安装包必须要有管理员权限)
首先切换为管理员用户:su root
示例:yum install lrzsz
卸载:
- yum remove —— 卸载软件包(卸载安装包必须要有管理员权限)
首先切换为管理员用户:su root
示例:yum remove lrzsz
2.vim —— 编辑器
—— 是一个命令行编辑器(写代码),默认无法使用鼠标(可以配置),因此拥有多种操作模式
查看该工具是否已经安装,查看该工具是否有版本信息,如果出现找不到命令,就表示没有
vim --version
安装:yum install vim
操作模式:
- 普通模式:进行文本常见操作 —— 复制、剪切、删除、粘贴、撤销、返回、文本对齐、光标的快速移动
- 插入模式:文本数据的插入
- 底行模式:进行文本的保存,退出,数据的匹配,查找,替换等操作
模式切换:
vim filename 打开已有文件,或者创建一个新文件,打开之后默认处于普通模式
- 普通模式→插入模式:i —— 进入插入模式;a —— 光标后移一个字符,进入插入字符;o —— 在光标所在行下方创建新行,进入插入模式;I,A,O
- 普通模式→底行模式:使用英文冒号 : 进入底行模式,实现文本的保存和退出操作 :q ——退出、:w —— 保存、:wq —— 保存并退出、:q! —— 强制退出且不保存
- 其他模式→普通模式 :所有模式都是围绕普通模式切换的,任何模式下按Esc键,都可以返回普通模式
普通模式下的操作指令:
- 光标移动 : h、j、k、l ——上下左右移动光标,w / b —— 按单词移动光标,ctrl+f / b —— 上下翻页,gg / G —— 文档首行/末行。
- 文本操作: yy / nyy —— 复制 ;p/P —— 粘贴;dd / ndd —— vim 中没有删除,删除就相当于剪切;x —— 删除单个字符 ;dw —— 删除单词
- 其他操作:u —— 撤销上一次操作;ctrl+r 撤销的反向操作;gg=G —— 全文按照文档格式进行对齐
注意:所在目录必须具有可写权限
在使用vim打开文件时,每次其实是打开一个临时文件,作为中间交换文件,然后关闭源文件,编辑的操作都是在中间文件中完成的,只有使用正规退出(:wq)的时候,才会将改变的数据写入源文件中,并且删除中间文件,否则中间文件存在的情况下,下次vim打开文件的时候,就会有提示信息(删除这个中间文件后就没有)
3.gcc —— 编译器
—— 将所写的高级语言代码解释成为机器指令集
查看该工具是否已经安装,查看该工具是否有版本信息,如果出现找不到命令,就表示没有
gcc --version
安装:yum install gcc gcc-c++
gcc 是c语言的编译器,g++是c++的编译器
作用:c、c++语言是高级语言,机器无法识别这些代码,需要编译器,将高级语言代码解释为机器指令,生成可执行程序文件才能执行
可执行的程序文件:一段功能的机器指令集
gcc编译器,在链接生成可执行程序时,会默认链接标准c库
3.1编译过程:
- 预处理:展开所有代码(引入头文件,宏替换,删除注释……) ;gcc -E
- 编译:进行语义语法纠错,没有错误了将代码解释为汇编代码;gcc -S
- 汇编:将汇编代码解释成为机器指令; gcc -c
- 链接:将所有用到的机器指令文件打包到一起,生成可执行程序。默认链接方式—— 动态链接(不仅仅是我们自己写的文件,还包括库文件)
- 链接方式:动态链接-链接动态库,只要库中的函数符号列表,运行依赖库;静态链接-链接静态库,获取库中函数实现。
gcc编译器常见操作选项:
-
-o —— 指定要生成的文件名称(不指定生成的可执行文件默认为a.out)
-
-E —— 只进行预处理
命令:gcc -E a.c -o a.i
-
-S —— 只进行编译
命令:gcc -S a.i -o a.s
-
-c —— 只进行汇编
命令:gcc -c a.s -o a.o
-
gcc —— 链接
在gcc命令后面紧跟目标文件的名字,就可以将目标文件链接成为可执行文件- 命令:gcc a.o (不使用 -o 指定名称,默认生成a.out可执行文件)
- 如果指定文件名称:
- 通过-o选项也可以将可执行文件输出到其他目录,并不一定非得在当前目录下,例如:
命令:gcc a.o -o ./Test/main
注意: 也可以不用写 ./ ,默认是当前目录。Test 目录必须存在,如果不存在,gcc 命令不会自动创建,而是抛出一个错误。
- 命令:gcc a.o (不使用 -o 指定名称,默认生成a.out可执行文件)
3.2 运行可执行文件
上面我们生成了可执行程序,在控制台中输入程序的名字就可以,如下所示:
如果不写./,Linux 会到系统路径下查找 a.out,而系统路径下显然不存在这个程序,所以会运行失败。
3.3 完整过程
4.gdb —— 调试器
——调试程序运行过程
查看该工具是否已经安装,查看该工具是否有版本信息,如果出现找不到命令,就表示没有
gdb --version
安装:yum install gdb
说明:
- gdb 加载可执行文件,出现报错,报出的是源码的哪一行出的错。因为,调试的可执行程序就是通过源文件生成的。
- 调试一个程序的运行过程,能够让我们从运行过程中发现程序哪里有问题,可以适当的改变数据达到某种调试目的,并不是所有的程序都可以调试,调试器只能调试具有调试符号信息的程序 —— debug版本的程序
- 调试一个程序前提:这个程序是一个debug版本程序。gcc生成可执行程序,默认会生成release版本的程序,程序中没有调试符号信息,想要生成debug版本需要加上-g选项
例如: gcc -g a.c -o main
4.1 调试器加载程序
-
gdb ./main —— 直接使用gdb加载程序
-
gdb -p 进程id —— 直接对一个正在运行中的程序进行调试,-p用于指定进程id
4.2 开始调试程序
-
run —— 直接运行
段错误也就是内存访问错误
-
start —— 开始逐步调试
4.3 常用调试指令
1. 流程控制:
- next/n —— 下一步,遇到函数直接运行,不会跟踪进入
- step/s —— 下一步,遇到函数则跟踪进入函数
- list/l —— 默认查看调试行附近代码,也可以指定行 list a.c:20
- until —— 直接运行到指定行,也可以指定文件,until a.c:25
- continue/c —— 继续运行,直到断点处停下
2. 断点操作:break/b
- break a.c:9 —— 给指定文件指定行打断点,程序运行到断点就会停下
- break function —— 给函数打断点
- info break 查看断点信息
- watch —— watch a给变量打断点,当变量数据发生改变的时候停下
- delete/d —— 删除断点
3. 内存操作:
-
print/p —— 查看变量数据print a;print a=10设置变量数据
-
backtrace —— 查看程序运行调用栈信息,程序一旦崩溃,查看调用栈可以快速定位崩溃位置——栈顶函数(因为当程序崩溃的时候,栈顶函数来不及出栈,因此栈顶函数就是崩溃位置)
5.make/Makefile(makefile) —— 项目自动化构建工具
—— 自动化的将某个项目构架成功
Makefile —— 普通的文本文件,用于记录项目的构建规则流程
make —— Makefile解释程序,对Makefile中的构建规则逐行进行解释执行,完成项目的构建
5.1 Makefile的编写规则:
- 目标对象:依赖对象
目标对象 —— 是要生成的可执行程序的名称
依赖对象 —— 是生成目标对象所需的源码文件 - 制表符\t 执行指令 (只能是制表符,也就是tab,不能为空格)
- make在解释执行的时候会找到当前所在目录中的Makefile文件,在这个文件中找到第一个目标对象,执行这个目标对象对应的指令
5.2 make的执行规则:
-
—旦在命令行执行make,则运行make解释程序,在当前目录下寻找Makefile文件,如果没有Makefile文件就会停止执行
-
make的执行规则中,要生成目标对象,首先要先保证依赖对象已经生成,则会递归向下寻找依赖对象的生成规则
-
打开文件,找到第一个目标对象,与依赖对象进行时间关系判断,判断目标对象是否需要重新生成(只生成第一个目标对象就会退出)
-
若需要生成,则执行指令;(指令不—定非是生成目标对象的指令)
5.3 Makefile编写规则进阶
make中的预定义变量:预定义变量通常都是在执行指令中使用
- $@ —— 表示目标对象
- $^ —— 表示所有依赖对象
- $< —— 表示所有依赖对象中第一个依赖对象
% —— 通配符的使用:匹配识别任意字符串
wildcard / patsubst 关键字的使用(patsubst 这个关键字就是一个字符串替换功能,只是获取到文件名称数据)
伪对象声明使用:
.PHONY:目标对象名称
伪对象的作用:不管对象是否最新,每次都要重新生成
- 不声明伪对象使用:
- 声明伪对象使用: