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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值