只有不停的努力,才能看起来很轻松!!!加qq1126137994共同学习探讨更多技术!!!
1、思考:
makefile中的目标究竟是什么?
在默认的情况下:
- make认为目标对应一个文件
- make比较目标文件和依赖文件之间的新旧关系,决定是否执行相应命令
- make以文件处理作为第一优先级
但是当我们的目标不是一个文件,语法上要有什么变化呢?
例如下图:
当执行:make clean 时,我们是希望执行rm *.o hello.out的命令的。、
如果文件中没有命名为clean的,上述执行可以正常进行,但是如果当文件中存在文件名为clean时,我们执行make clean命令,make程序就会把clean当成是那个文件来处理,而不会按上述所说的执行!
解决办法:
引入伪目标
- 通过.PHONY关键字声明伪目标
- 伪目标不对应任何实际的文件
- 伪目标的命令总是执行,不管伪目标的依赖是否有更新都要总是执行!!!
伪目标的语法:先声明,后使用!!!
本质:伪目标是make程序中特殊目标.PHONY的依赖
.PHONY:clean
##注释##
clean:
rm *.o hello.out
下面给出一个例子来看看伪目标的使用(所依赖的文件func.c与main.c是上一篇文章里的点击链接查看:点击查看):
hello.out all : func.o main.o
gcc -o hello.out func.o main.o
func.o : func.c
gcc -o func.o -c func.c
main.o : main.c
gcc -o main.o -c main.c
.PHONY : clean
clean:
rm *.o hello.out
输入make的运行结果为:
输入make clean的运行结果为:
2、伪目标的妙用(函数调用)
伪目标的调用:规则调用(函数调用)
hello.out : func.o main.o
gcc -o hello.out func.o main.o
func.o : func.c
gcc -o func.o -c func.c
main.o : main.c
gcc -o main.o -c main.c
.PHONY : rebuild clean all ##原理:当一个目标的依赖包含伪目标时,伪目标所定义的命令总是被执行
rebuild : clean all ##模拟函数的调用
all : hello.out
clean :
rm *.o hello.out
注意:如果我们使用的是GNU的make,用.PHONY声明伪目标没有任何问题,但是如果我们不是用的GNU的make,有可能其他的make程序不支持,PHONY声明伪目标,这个时候,我们就需要避开.PHONY,用其他方法声明伪目标!!!
可以像如下图一样定义伪目标clean:
原理:如果一个目标没有命令或者依赖,并且它不是一个已经存在的文件名,在执行此规则时,目标总会认为是最新的!!!
例子:
hello.out all : func.o main.o
gcc -o hello.out func.o main.o
func.o : func.c
gcc -o func.o -c func.c
main.o : main.c
gcc -o main.o -c main.c
clean:Force
rm *.o hello.out
Force:
运行结果与上述的运行结果一致!!!
3、总结:
- 默认情况下,make认为目标对应着一个文件
- .PHONY用于声明一个伪目标,伪目标不对应实际的文件
- 伪目标的本质是make中特殊目标.PHONY的依赖
- 使用伪目标可以模拟“函数调用”
想一起探讨以及获得各种学习资源加我(有我博客中写的代码的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。
本学习记录完全来源于狄泰软件学院的相关课程,可以加我q:1126137994或者Q群:199546072 ,给你推荐更多学习课程。