Makefile 里面是由一系列的规则组成的,这些规则格式如下:

目标…... : 依赖文件集合……

命令 1

命令 2

……

目标:这里仅仅是一个字符串标示(动作名字)的作用,真正的文件生成时命令1,2...所做的事,比如gcc才是生成一个文件。因此makefile的作用仅仅是指定编译规则,以字符串操作为基础的规则罢了。


makefile的原理:文件的生成是命令中完成的,makefile仅仅是一个字符串执行者。

main:main.o        #main在makefile看来也是一个文件的名字,第一次时候,main文件不存在(所以不存在是不是文件为最新的问题了),因此一定会执行绿色的命令。当第二次的时候,如果main.o是最新的,即该文件创建时间不晚于main.c文件创建时间,因此认为main.o没必要重新生成,因此红色行命令不会得到执行,而main文件创建时间也不晚于main.o,因此绿色这行没必要执行。

        gcc -o main main.o

main.o:main.c

        gcc -c main.c

clean:        #clean在makefile看来也是一个文件的名字,由于蓝色命令中没有生成clean文件的动作,因此使用make clean指令,总能执行蓝色的命令。但是,当我们在目录中手动误操作或者同名冲突等原因创建一个clean文件,执行make clean指令时候,由于clean文件存在,而且后面没有依赖文件,会认为总是最新的,因此其对应的蓝色命令得不到执行,此时就会得不到我们预期的清理效果。因此,为了解决这个问题,我们只需要把clean声明为伪目标,那么无论是否存在clean文件,都会执行蓝色的命令。

        rm *.o

        rm main

即,加一行

.PHONY : clean

makefile伪目标详解_makefile伪目标