前言
本篇文章将讲解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 :
总结
本篇文章主要给大家讲解了什么是伪目标,希望大家好好总结。
在 Makefile 中,伪目标(Phony Target)是一种特殊类型的目标,它并不表示生成任何文件,而是表示一个动作或操作。定义伪目标的主要意义在于:
命名约定:通过定义伪目标,可以对常用的操作或任务进行命名约定,使得其他开发者或使用者能够清晰地理解该目标的用途和作用。
避免与同名文件冲突:有时候,可能会有与目标同名的文件存在。通过定义伪目标,可以避免与同名文件产生冲突。伪目标的存在告诉 Make 工具该目标不是用于生成文件,而是执行相应的操作。
组织和管理构建任务:伪目标可以用来组织和管理构建流程中的各个任务或操作。通过定义伪目标,可以将相关的任务组织在一起,并通过依赖关系和命令定义来控制它们的执行顺序。
提高可读性和可维护性:通过使用伪目标,可以使 Makefile 更具可读性和可维护性。通过给任务命名,并将任务的逻辑和命令定义在一处,可以提高代码的清晰度和可维护性。
执行常用操作:伪目标通常用于执行一些常用操作,例如清理临时文件、测试项目、生成文档、打包发布等。通过定义伪目标,可以方便地执行这些操作,而无需手动输入复杂的命令。