Makefile 项目管理
作者:
也许
,
2022-04-11 20:58:23
,
所有人可见
,
阅读 245
gcc 编译方式
1. 一起编译,一起链接
gcc -o test main.c sub.c
2. 分开编译,统一链接
gcc -c -o main.o main.c
gcc -c -o sub.o sub.c
gcc -o test main.o sub.o
编写makefile一般使用方式2,根据makefile规则,没有改变的源文件不会重新编译,这样提高了程序编译效率
若采用方式1,没有改变的源文件也会重新编译,这是没有必要的浪费了系统资源
1个规则
1. 命名:makefile Makefile
2. 基本格式:
目标:依赖文件
生成命令
3. 运行规则:
3.1 依赖条件若不存在,找寻新的规则去生成依赖条件
3.2 目标的时间(atime)必须晚于依赖的时间,否则,makefile会更新目标
若依赖文件改变则更新目标,依赖文件不变则不更新目标
4. 指定makefile生成的目标文件:
makefile 默认第一行的目标为makefile的最终文件
可以使用ALL:目标指定最终生成的目标文件
2个函数
1. src = $(wildcard ./*.c):匹配当前工作目录下所有.c文件,组成列表赋值给src(注意可以更换目录)
2. obj = $(patsubst %.c, %.o, $(src)):将参数3包含参数1的部分替换为参数2
3. clean:(无依赖文件)
-rm -rf $(obj) a.out "-"的作用:删除不存在的文件不报错
3个自动变量
1. $@:在规则的命令中,表示规则中的目标
2. $^:在规则的命令中,表示所有依赖条件
3. $<:在规则的命令中,表示第一个依赖条件,若将该变量应用于模式规则中,它可将依赖项从依赖列表中依次取出,套
用模式规则。
4. 模式规则:
%.o:%.c
gcc -c $< -o $@
"%.o" 把我们需要的所有的 ".o" 文件组合成为一个列表,从列表中挨个取出的每一个文件,
列表是obj = $(patsubst %.c, %.o, $(src))
"%" 表示取出来文件的文件名(不包含后缀),然后找到文件中和 "%"名称相同的 ".c"
文件,然后执行下面的命令,直到列表中的文件全部被取出来为止。
通配符*和%的区别:
*和%都可以匹配多个字符,但是%有锁定的作用,即%.o:%.c,前一个%和后一个%内容相同
*.o:*.c,前一个*和后一个*内容可能并不相同
5. 静态模式规则:表示对哪一个依赖条件套用模式规则
$(obj):%.o :%.c
gcc -c $< -o $@
6. 伪目标:将clean,ALL变成伪目标
.PHONY:clean, ALL