目录:
- 编程辅助工具
- 模式切换
- 编译器
- 调试器
- 函数调用栈
- make/makefile
1.编程辅助工具:
yum:Linux软件包管理器(相当于应用商店)
查看软件包 yum list
lrzsz yu list | grep lrzsz
安装软件包 yum lnstall
lrzsz.x86_64 yum install lrzsz.x86_64 yum install lrzsz
移除软件包 yum remove
vim编辑器:因为vim模式不能使用鼠标,因此为了完成能够插入,删除,复制,粘贴各个操作
vim将操作分为很多模式,一共有12种模式,但常用的只有3种
插入模式:插入数据
普通模式:完成命令操作(常用的有:移动光标,复制,粘贴,删除,撤销,恢复撤销)
底行模式:保存文件,退出编辑
2.模式切换:
普通模式——>插入模式 i(从光标所在位置开始) I 光标移动到首行开始插入
a 光标移动到下一个字符串开始插入 A 光标到行尾开始插入
o 光标所在行的下一行添加新行开始插入 O 光标所在行上行添加新行开始插入
插入模式——>普通模式
ESC
普通模式——>底行模式
: / ?
低行模式——>普通模式
ESC
底行模式下操作:
:w(保存) :wq(保存并退出) :q :q!(强制性退出) 保存并退出操作
/string ?string 字符串查找
普通模式下操作:
光标移动 hjki左下上右移动 w/b按单词移动 ctrl+f/ctrl+b 上下翻页 gg/G 文档头尾
复制 yy复制光标所在行 3yy从光标所在行向下复制3行
粘贴 小写p向光标所在行下方粘贴 大写P向光标所在行上方粘贴
删除 dd删除光标所在行 ndd从光标所在行向下删除n行
x删除光标所在一个字符 dw删除光标所在单词 D删除光标之后的数据
撤销 u
恢复撤销 ctrl+r
3.gcc编译器
gcc将高级语言(C语言)编译成机器可以识别的语言
预处理:条件编译,去注释
编译:将C语言代码解释成汇编代码
汇编:将汇编代码->机器指令
链接:生成可执行文件或库函数(链接库文件里的代码)
静态链接:链接静态库,将库中代码拷贝到程序中,程序比较大,但是运行时不需要依赖静态库的存在
静态库如果多个程序用了相同的静态库,运行时程序被加载到内存中,会出现多份冗余代码
而动态库,在内存中共享同一份动态库代码
动态链接:链接动态库,记录函数位置符号信息,程序比较小,但是运行时需要依赖动态库的存在
【共享库/运行时库】
gcc常用选项
-E 只进行预处理 -S只进行编译 -c只进行汇编
-o 用于指定生成的文件名称
-static 使用静态链接
4.gdb调试器
调试程序运行过程前提---调试bug
0.向程序中加入调试符号信息debug【前提】 gcc默认生成的是release发布版程序,程序中可执行程序中没有加入调试符号信息
gcc -g :生成debug版本可执行程序
1.加载程序 gdb./main【gdb加载程序的时候如果有运行程序参数,不能加载的时候给与】
2.开始调试
run 直接运行程序 start 开始逐步调试
3.常见操作
list 查看代码 next(n) 下一步
start(s) 下一步
4.断点相关操作
break file main.c:n 在某一行(n)打断点
break test 给函数打断点 info break 查看断点信息
print 查看变量内容
print var
continue (c) 继续运行 delete break_id 删除断点 watch 变量监控(当变量内容改变时停下来)watch var
5.函数的调用栈信息:
backtrace:快速定位
6.make/makefile
make/Makefile:项目自动化构建工具
Makefile:普通文本文件,但是不普通的是它记录的是项目的固件流程规则
make:Makefile的解释器,完成项目的构建
在当前目录下敲击make
Makefile基本编写规则:
目标对象:[依赖对象]
tab 要执行的对象
make的解释规则:
make打开Makefile文件后,寻找到第一个目标对象
若没有找到:认为没有要生成的对象,报错并退出
若找到了:判断目标对象文件是否存在
目标对象文件若存在:判断是否有依赖对象名称
若没有依赖对象:检测外部是否存在目标对象文件(是否已生成过了)
目标对象未生成:执行要执行的命令(生成目标对象的命令)
目标对象已生成:报错,目标对象已有,不需要重新生成
有依赖对象:判断依赖对象是否存在;
若存在:检测目标对象和依赖对象的最后一次修改时间
目标对象文件不存在:则直接执行命令生成
Makefile预定义变量:
$^:所有的依赖对象 wilecard:获取所有的文件名
$<:依赖对象中的第一个 patsubst:
$@:目标对象
伪对象:不管对象是否最新,是否存在,每次都需要为对象执行生成命令
声明伪对象:.PHONY:clean
~bye~