精简Makefile

如果在Linux下玩不转Makefile,那你真out了,这应该是Makefile较为精华的部分,难得共享。偷笑

 

一、一个简单通用的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以及gccc A.co 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)书写规则建议的方式是:单目标,多依赖。就是说尽量要做到一个规则中只存在一个目标文件,可有多个依赖文件。尽量避免多目标,单依赖的方式。

你可能感兴趣的:(linux,linux,linux,makefile,makefile)