只有不停的努力,才能看起来很轻松!!!加qq1126137994共同学习探讨更多技术!!!

1、思考:

makefile中的目标究竟是什么?

在默认的情况下:

  1. make认为目标对应一个文件
  2. make比较目标文件和依赖文件之间的新旧关系,决定是否执行相应命令
  3. 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、总结:

  1. 默认情况下,make认为目标对应着一个文件
  2. .PHONY用于声明一个伪目标,伪目标不对应实际的文件
  3. 伪目标的本质是make中特殊目标.PHONY的依赖
  4. 使用伪目标可以模拟“函数调用”

想一起探讨以及获得各种学习资源加我(有我博客中写的代码的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。

本学习记录完全来源于狄泰软件学院的相关课程,可以加我q:1126137994或者Q群:199546072 ,给你推荐更多学习课程。