1.1 Makefile的规则
target... : prerequisites ...
command
...
...
解释:
Target : 是一个目标文件,也可以是执行文件,还可以是一个标签(Label)。
Prerequisites :要生成那个target所需要的文件或是目标。
Command : make需要执行的命令。(任意的Shell命令)
1.2 一个示例
main : main.o run.o speak.o eat.o sleep.o
gcc -o main main.o run.o \
speak.o eat.o sleep.o
main.o: main.c
gcc -c main.c
run.o : run.c run.h
gcc -c run.c run.h
sleep.o : sleep.h sleep.c
gcc -c sleep.h sleep.c
eat.o : eat.h eat.c
gcc -c eat.c eat.h
speak.o : speak.h speak.c
gcc -c speak.h speak.c
clean :
-rm main.o run.o \
speak.o eat.o sleep.o main
反斜杠(\)是换行符的意思。这样比较便于Makefile的易读。
一、在定义依赖关系后,后续的那一行定义了如何生成目标文件的操作系统命令,一定要以一个Tab键作为开头。
二、make会比较targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的日期要新,或者target不存在的话,那么,make就会执行后续定义的命令。
三、clean不是一个文件,它只不过是一个动作名字,有点像C语言中的lable一样,其冒号后什么也没有,那么,make就不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。要执行其后的命令,就要在make命令后明显得指出这个lable的名字。这样的方法非常有用,我们可以在一个makefile中定义不用的编译或是和编译无关的命令,比如程序的打包,程序的备份,等等。
1.3 makefile中使用变量
对于.o文件多次被使用,在makefile中以“$(objects)”的方式来使用这些变量
OBJECTS= main.o run.o \
speak.o eat.o sleep.o
main : $(OBJECTS)
gcc $(CFLAGS) -o main $(OBJECTS)
main.o: main.c
gcc $(CFLAGS) -c main.c
run.o : run.h run.c
gcc $(CFLAGS) -c run.h run.c
sleep.o : sleep.h sleep.c
gcc $(CFLAGS) -c sleep.h sleep.c
eat.o : eat.h eat.c
gcc $(CFLAGS) -c eat.h eat.c
speak.o : speak.h speak.c
gcc $(CFLAGS) -c speak.h speak.c
clean :
-rm $(OBJECTS) main
1.4 让make自动推导
GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个[.o]文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。
只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,如果make找到一个whatever.o,那么whatever.c,就会是whatever.o的依赖文件。并且 cc -c whatever.c 也会被推导出来,于是,我们的makefile再也不用写得这么复杂。我们的是新的makefile又出炉了。
CFLAGS = -Wall
OBJECTS= main.o run.o \
speak.o eat.o sleep.o
main : $(OBJECTS)
gcc $(CFLAGS) -o main $(OBJECTS)
eat.o main.o : eat.h
run.o main.o : run.h
speak.o main.o : speak.h
sleep.o main.o : sleep.h
.Phony : clean
clean :
-rm $(OBJECTS) main
1.5 清空目标文件的规则
.PHONY : clean
clean :
-rm edit $(objects)
为了避免和文件重名的这种情况,我们可以使用一个特殊的标记“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。
在rm命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。当然,clean的规则不要放在文件的开头,不然,这就会变成make的默认目标,相信谁也不愿意这样。不成文的规矩是——“clean从来都是放在文件的最后”。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。