Makefile
Makefile:定义规则指定文件的编译顺序;类似shell脚本,执行操作系统命令
优点:自动化编译——通过make(解释Makefile文件中指令的命令)命令完全编译整个工程,提高软件开发效率;
如何写Makefile
文件命名:makefile/Makefile
一个Makefile可以有一个/多个规则
目标...:依赖...
命令(shell 命令)
...
目标:要生成的文件
依赖:生成目标所需的文件/目标
命令:通过命令对依赖操作生成目标
在目录在创建Makefile文件,里面的内容如下:
可能会出现 E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用) E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend)
sudo rm /var/lib/dpkg/lock-frontend
随后sudo apt install make 即可安装;
在当前目录下执行make指令(会自动寻找当前目录下的Makefile):
Makefile的工作原理
1. 命令执行前,先检查规则中的依赖是否存在
若存在则执行命令
若不存在,往下看别的规则,看能不能生成尚不存在的依赖
默认执行第一条规则,与第一条规则没有关系的规则不会执行
2. 检查更新,在执行规则命令,比较目标和依赖文件的时间;依赖晚于目标则重新生成目标,否则规则中的命令不执行(检测更新机制)
Makefile中的变量
自定义变量:变量名=变量值 ; $(变量名) = 变量值
模式匹配:eg. %.o:%.c
$(wildcard PATTERN ...) - 获取指定目录下指定类型的文件列表
$(patsubst <pattern>,<replacement>,<text>) - 查text单词,匹配pattern用replacement替换
首先读取当前目录下的所有.c文件为src,通过patsubst将.c替换为.o后根据变量名写规则,通过模式匹配来进行其余规则指定
可以通过在最后添加
.PHONY:clean // 伪目标
clean:
rm $(objs) -f删除生成的.o文件;
make clean
GDB调试
GDB是GNU提供的调试工具;
准备工作
1. 关掉编译器优化选项 -o
2. 打开调式选项 -g(在可执行文件中加入源代码信息)
3. -Wall 打开所有warning
gcc -g -Wall program.c -o program
调式时必须保证能够找到源文件
GDB常用相关命令
gcc -g -Wall test.c -o test
gdb test
断点在GDB退出后会自动清除
要跳出函数体或循环需要先清理断点