一,vim
二,gcc
三,gdb
四,make和Makefile
一,vim(vi编辑器的升级版本,兼容vi的所有命令指令)
1.vim是什么?
linux下最受欢迎的编辑器
2.vim的三种常用操作模式
普通模式--->插入模式 | 按 i ,a , o , I , A , O |
---|---|
普通模式--->任意模式 | 按 Esc |
普通模式--->底行模式 | 按 :(英文冒号) |
PS: 要切换到一个模式,必须先切换到普通模式
(1)普通模式:针对文本命令进行操作的模式,是所有模式之间切换的基础模式,主要用来控制屏幕光标的移动,字符、字或行的删除等。
ps:打开vim之后默认处在普通模式
@ 常见操作:
- vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母hjki分别控制光标左、下、上、右移
- 按「G」:移动到文章的最后[重要]
- 按[gg]:进入到文本开始
- 按[shift+g]:进入文本末端
- 按「ctrl」+「b」:屏幕往“后”移动一页
- 按「ctrl」+「f」:屏幕往“前”移动一页
- 按「yy」: 复制光标所在行 nyy----->从光标所在行复制n行
- 按「dd」: 剪切(删除)光标所在行 ndd----->从光标所在行剪切(删除)n行
- 按 「p」:将剪切板的内容进行粘贴 np------>将剪切板的内容进行粘贴n遍
- 按「dw」:删除单词
(2)底行模式
@常见操作
- w 只进行保存
- q 退出
- wq 保存并退出
- q! 强制退出
- number 跳转到第number行
ps: 不能使用Ctrl+z退出vim
二,gcc
使用C/C++/Java等语言写出来的语言并不能够直接被计算机识别。原因:C/C++等语言属于高级语言,无法被机器直接识别,需要使用编译器将高级语言代码解释成为二进制机器指令,然后才能被计算机硬件进行识别。从而运行程序。
(1)gcc简介
GCC是一种编程语言编译器。GNU编译器套件包括C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包括了这些语言的库。
(2)gcc完成编译的步骤
#预处理(进行宏替换):主要包括宏定义,文件包含,条件编译,去注释等
-E | 让gcc在预处理之后停止编译过程 |
-o | 指定要生成的文件名称 |
例如:gcc -E main.c -o main.i
#编译(生成汇编):gcc检查代码的规范性,是否有语法错误等,以确定代码实际要做的工作,在检查无误后将代码生成汇编语言。
-S | 只进行到编译而不生成汇编 |
例如:gcc -S main.i -o main.s
#汇编(生成极其可识别代码):汇编阶段是把编译阶段生成的“.s”文件转成目标文件
读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
-c | 生成转化为“.o”的二进制目标代码 |
例如:gcc -c main.s -o main.o
#链接:将所有的.c文件生成的二进制机器指令以及库打包到一起生成可执行文件
例如:gcc main.o main1.o main2.o ........ -o main(main是终极目标对象)
此外也可以一步生成最终程序 gcc main.c -o main
(3)函数库
概念:针对常用功能将大量函数进行编译后生成的二进制机器指令打包到一起,封装好的接口文件。其中链接方式分为静态链接和动态链接两种。
例如;在使用printf函数的时候,在代码中只包含了#include<stdio.h>这个头文件,在该头文件中只有printf函数的声明,并没有函数的实现,那么在代码中调用该函数的时候就会从相对应的库文件中去搜索并使用对应的函数实现方式,即是所谓的链接。
1. 静态链接:链接时直接将库中使用到的函数具体实现指令拷贝一份到可执行程序中。
优点:无运行依赖 ps:(即时将用到的函数库删除,也不会影响到代码的正常运行)
缺点:生成的可执行文件比较大,库中代码可能在可执行程序中加载多份。 ps:(比如多次使用printf函数,那么就会多次将printf函数的实现代码加载到可执行文件中)
2.动态链接:链接时将苦衷使用到的函数符号表(可以将函数符号表理解为一个记录函数位置和具体实现的符号)记录到可执行程序中(并非把具体函数实现指令拿过来)
优点:生成的可执行程序比较小,多个程序可以在内存中使用同一份库代码。(节省资源)
缺点:有运行依赖 ps: (运行时需要加载库到内存中,一旦库被删除,程序无法运行)
三,gab调试器
(1)gdb简介:gdb是 Linux 下常用的程序调试器.当下的gdb支持调试多种编程语言编写的程序,包括 C、C++等。
(2)调试背景:一个程序想要被调试必须是在debug的模式下才可以被支持调试。linux中gcc/g++运行出来的程序默认是release模式。ps:因此想要在gdb情况下进行调试必须在执行gcc命令时加上-g选项 例如:gcc -g main.c -o debug_main (gcc main.c -o release_main )
(3)调试过程:
#1.开始调试命令
使用gdb加载程序: gdb ./ main (gdb + 路径 + 文件名)
#2.开始调试
start------------>开始逐步调试
run-------------->直接运行
#3.逐行调试
next------------->逐过程调试(遇到函数直接把函数运行完毕)
step------------->逐语句调试(遇到函数进入函数逐语句调试)
until------------->运行到指定文件的指定行(例如 until main.c : 10 运行到main.c的第10行)
ps: next的简写是n step 的简写是s 可以直接使用简写来进行调试
#4.list 查看代码
list ------------->默认查看调试行附近的代码(例如:list main.c :10 查看第10行附近的代码)
#5.断点操作
break ------->打断点
给指定行代码打断点————> break main.c : 10;
给指定函数打断点—————> break BubbleSort
continue -------------> 从当前位置继续向下运行
info break ------------> 查看所有断点信息
delete -----------------> 删除指定断点
例如:delete break 10 删除第10行的断点
#6.内存操作
print ---------------->变量的查看与设置
print variable ------------> 查看指定变量的值
print variable = 10 ------------> 设置指定的变量值为10
backtrace---------------->查看函数调用栈
程序当前的运行位置肯定是函数调用栈的栈顶函数,因为函数都是逐个压栈的,当程序崩溃时,出错函数一定是栈顶函数(程序崩溃时栈顶函数没来得及出栈)。
四.make&Makefile
(1)简介:Makefile:普通的文本文件,在这个文件中记录项目的构建规则
make:是控制源文件生成可执行文件的工具。(简单来说:make是一个程序,叫做Makefile解释器,将Makefile中的项目构建规则进行执行,完成项目的构建)
(2)make的解释执行规则
1.执行make的时候,会在当前目录下找寻Makefile文件进行解释
2.将Makefile中的第一个文件当作终极目标对象(上图中的main文件)。
3.检测目标对象是否需要重新
(1)目标对象不存在,重新生成
(2)依赖对象被修改过,重新生成
(3)依赖对象不存在,则需要查找依赖对象的生成规则,将依赖对象生成
例如:图中的main.o 是 main的依赖对象
main.s是main.o的生成对象
main.i是main.s的生成对象
4.所有的依赖对象都更新生成后,再执行指令,生成终极目标对象
(3) Makefile中的其他编写规则
1.伪对象 :与外部的实际文件解除关联关系,表示这个对象无论如何都要进行规则指令的执行
声明: .PHONY 例如: .PHONY : clean 将clean对象声明为伪对象
2.自动变量/预定义变量:在不同位置表示不同数据的内置变量(简单来说就是内容替换)
$< 所有依赖对象中的第一个
$^ 所有依赖对象
$@ 目标对象
(4)在实际的Makefile编写中,大多时候都会将编译和来链接分开,哪个文件被修改过,就重新生成哪个,最终进行打包,提高编译效率。