精简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(工作中其实main.h可以不用的,也不用生成main.o)

在同一目录,不同目录下,如果目录多,一般用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)书写规则建议的方式是:单目标,多依赖。就是说尽量要做到一个规则中只存在一个目标文件,可有多个依赖文件。尽量避免多目标,单依赖的方式。

 

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值