文章目录
- 前言
- 一、伪目标概念
- 二、进一步了解伪目标
- 三、不使用.PHONY来定义伪目标
- 总结
前言
本篇文章将讲解Makefile中的伪目标,Makefile的目标在前面的文章中我们已经讲解了那么这篇文章我们就来讲讲伪目标。
一、伪目标概念
Makefile 伪目标是一类特殊的目标,它们的目的是提供给 make 工具一些命令,而不是用来构建文件的。因为伪目标通常不会对应实际的文件,所以它们的目的也不是为了构建文件,而是执行一些特定的操作,如清理编译过的目标文件、运行测试等。
Makefile 伪目标的名字通常没有实际的文件名或者函数名那么有意义,通常以 .PHONY 为名,表示该目标是伪目标,不对应实际的文件。
例如,下面的 Makefile 文件定义了一个伪目标 clean,用于清理生成的目标文件:
hello all : hello.o func.o
gcc -o hello hello.o func.o
hello.o : hello.c
gcc -c -o hello.o hello.c
func.o : func.c
gcc -c -o func.o func.c
.PHONY: clean
clean :
rm *.o hello
首先我们执行make命令:
执行完make命令后能够查看到生成的.o文件和hello可执行文件:
然后我们执行make clean命令:
再次查看文件:
可以发现这些生成的.o和可执行文件都被移除了。
所以伪目标的作用就是可以帮助我们去执行一些特定的命令。
二、进一步了解伪目标
我们对上面这个makefile进行一些改进:
hello : hello.o func.o
gcc -o hello hello.o func.o
hello.o : hello.c
gcc -c -o hello.o hello.c
func.o : func.c
gcc -c -o func.o func.c
.PHONY: clean rebuild all
rebuild : clean all
all : hello
clean :
rm *.o hello
这里新添加了rebuild 和 all伪目标
那么我们就能够使用make rebuild 和make all这两个命令来执行makefile了
执行结果:
make rebuild就是帮助我们先清除生成的文件然后再重新生成这些文件。
为什么执行了make rebuild 就可以达到这样的效果呢?
当我们在命令行中输入 make rebuild 后,make 工具会先执行 clean 目标中定义的删除操作,然后再执行 all 目标中定义的编译操作,这相当于先清空所有目标文件,再完成新一轮的编译操作。
all 和 clean 作为伪目标,不对应实际的文件或者函数,所以它们不会触发实际的编译过程,而是只执行它所规定的命令。
三、不使用.PHONY来定义伪目标
前面我们都是使用的.PHONY来定义一个伪目标的,在这里也可以不使用.PHONY来定义伪目标。
在clean后面加一个FORCE依赖。
这个FORCE依赖在后面也作为一个目录使用,当一个目标没有命令或者依赖并且他也不是一个文件名时认为这个目标永远都是最新的。所以无论目录下是否存在clean文件执行make clean都可以达到我们想要的效果。
hello all : hello.o
gcc -o hello hello.c
clean : FORCE
rm *.o
FORCE :
总结
本篇文章主要给大家讲解了什么是伪目标,希望大家好好总结。