以这个简单的makefile文件为列
# 生成可执行文件main
main:main.o
cc -o main main.o
# 生成main.o对象文件
main.o:main.c
cc -c main.c
# 清除指令,删除执行过程中生成的文件
# 伪目标
.PHONY:clean
clean:
rm main main.o
规则格式
target...:prerequisites...
<tab> command
- target :目标
- prerequisites:依赖文件
- command:命令
1.探究target和prerequisite的作用
- 执行
make main.o
- 运行日志
cc -c main.c
- 生成了main.o 文件
- 运行日志
- 再次执行
make mian.o
- 运行日志
'main.o' is up to date
,已经是最新了的
- 运行日志
- 修改main.c文件后
- 运行日志
cc -c main.c
- 生成了main.o 文件
- 运行日志
- 修改makefile文件为
main.o:
cc -c main.c
- 执行
make mian.o
- 运行日志
cc -c main.c
- 生成了main.o 文件
- 运行日志
- 执行
make mian.o
- 运行日志
cc -c main.c
- 生成了main.o 文件
6.修改makefile文件为
- 运行日志
main:main.c
cc -c main.c
- 执行结论和 4,5 的结果一样
结论
- 当target为目标生成文件的名称时,makefile会将目标名称对应的文件和依赖的文件进行最后修改时间对比,来判断是否需要执行命令生成新的文件,避免重复执行
- 不设置依赖文件或target名不是目标文件名 ,不影响target指令的执行
2.伪目标的问题
一些博客上说伪目标的做用是不生成目标文件
以上面clean目标为列
- 有
.PHONY:clean
代码时,执行make clean
- 执行了删除指令,没有生成clean文件
- 删除
.PHONY:clean
代码后,执行命令,也没有clean文件
结论
- 伪目标没有什么作用
- target名称本身不会产生文件,不是目标文件名时,仅充当方法名的作用
3.关于隐晦规则
- 删除一下代码
main.o:main.c
cc -c main.c
- 执行 make
- 日志
cc -c -o main.o main.c
- 日志
cc -o run main.o
- 日志
结论
C 编译过程中,有.o文件依赖时,如果没有显性规则生成.o文件,makefile会自动补全.o 的生成命令