一、一个简单通用的Makefile例子
1.编写源文件
5个源文件:A.c B.c C.c D.c main.c
5个头文件:A.h B.h C.h D.h main.h
在同一目录,不同目录下,如果目录多,一般用autotools生成Makefile。可链接:autotools生成Makefile(一)http://blog.csdn.net/huangminqiang201209/article/details/8271752
2.编写Makefile
#this is Makefile file
#include Makefile.param
OBJECTS= main.o A.o\
B.o C.o D.o
main : $(OBJECTS)
gcc –o main $( OBJECTS)
main.o : main.c main.h
A.o : A.h
B.o : B.h
C.o : C.h
D.o : D.h
.PHONY : clean
clean:
-rm $(OBJECTS) main
Makefile文件说明:
1) Makefile.param中多是一些变量的定义,“include"指示符告诉make暂停读取当前的Makefile,而转去读取“include”指定的Makefile.param,完成以后再继续当前Makefile的读取。Makefile中指示符“include”书写在独立的一行,指示符“include”所在的行可以一个或者多个空格(make程序在处理时将忽略这些空格)开始,切忌不能以[Tab]字符开始(如果一行以[Tab]字符开始make程序将此行作为一个命令行来处理)。
2)“OBJECTS”作为一个变量,它代表所有的.o文件的列表,当然也可以使用Makefile的自动化变量$^等等。
3) 可以将一个较长行使用反斜线(\)来分解为多行,这样可以使我们的Makefile书写清晰、容易阅读理解。但需要注意:反斜线之后不能有空格(这也是大家最容易犯的错误,错误比较隐蔽)。
4)自动推导规则(隐含规则):对一个目标文件是“N.o”,倚赖文件是“N.c”的规则,完全可以省略其规则的命令行,而由make自身决定使用默认命令,故A.o : A.h省略了A.c以及gcc–c A.c–o A.o这两步。
5)通过“.PHONY”特殊目标将“clean”目标声明为伪目标。避免当磁盘上存在一个名为“clean”文件时,目标“clean”所在规则的命令无法执行。
6)在命令行之前使用“-”,意思是忽略命令“rm”的执行错误。
二、Makefile小结:
1) make通过比较对应文件(规则的目标和依赖,)的最后修改时间,来决定哪些文件需要更新、那些文件不需要更新。
2)每一个命令行必须以[Tab]字符开始,[Tab]字符告诉make此行是一个命令行。
3)Makefile中第一个规则之后的所有以[Tab]字符开始的的行,make程序都会将其交给系统shell程序去解释执行。
4)一个目标可以没有依赖而只有动作(指定的命令)即伪目标。比如Makefile中的目标“clean”。
5)书写规则建议的方式是:单目标,多依赖。就是说尽量要做到一个规则中只存在一个目标文件,可有多个依赖文件。尽量避免多目标,单依赖的方式。