跟我一起写makefile 二

在跟我一起写makefile 一的文章中,简单按照最常规的并结合陈皓的跟我一起写makefile学习了怎么编写,今天学习了点儿新内容并上机熟练了下

说明:这里的很多内容都是来自陈皓的《跟我一起写makefile》,加上一些自己的理解和例子

区别于上一篇文章主要包括两点:

1.使用变量让makefile编写起来更简单

2.了解makefile的隐式规则


一、Makefile 里有什么?
 
Makefile 里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。
 
1、显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由 Makefile 的书写 者明显指出,要生成的文件,文件的依赖文件,生成的命令。
 
2、隐晦规则。由于我们的 make 有自动推导的功能,所以隐晦的规则可以让我们比较粗糙 地简略地书写 Makefile,这是由 make 所支持的。
 
3、变量的定义。在 Makefile 中我们要定义一系列的变量,变量一般都是字符串,这个有点 你 C 语言中的宏,当 Makefile 被执行时,其中的变量都会被扩展到相应的引用位置上。
 
4、文件指示。其包括了三个部分,一个是在一个 Makefile 中引用另一个 Makefile,就像 C 语言中的 include 一样;另一个是指根据某些情况指定 Makefile 中的有效部分,就像 C 语言 中的预编译#if 一样;还有就是定义一个多行的命令。有关这一部分的内容,我会在后续的 部分中讲述。
 
5、注释。Makefile 中只有行注释,和 UNIX 的 Shell 脚本一样,其注释是用“#”字符,这 个就像 C/C++中的“//”一样。如果你要在你的 Makefile 中使用“#”字符,可以用反斜框 进行转义,如:“\#”。


第一个在一里有,今天就来学习规则二和三

这里有三个.c文件,两个.h文件


在上面的例子中,先让我们看看 abc 的规则: 
 

abc:aaa.o bbb.o main.o
        gcc -o  abc aaa.o bbb.o main.o
main.o:main.c
        cc -c main.c
aaa.o:aaa.c aaa.h
        cc -c aaa.c
bbb.o:bbb.c bbb.h
        cc -c bbb.c
.PHONY:clean
clean:
        -rm main.o aaa.o bbb.o abc
 
1.使用变量让makefile编写起来更简单

我们可以看到[.o]文件的字符串被重复了两次,如果我们的工程需要加入一个新的[.o]文件, 那么我们需要在两个地方加(应该是三个地方,还有一个地方在 clean 中)。当然,我们的 makefile 并不复杂,所以在两个地方加也不累,但如果 makefile 变得复杂,那么我们就有可 能会忘掉一个需要加入的地方,而导致编译失败。所以,为了 makefile 的易维护,在 makefile 中我们可以使用变量。makefile 的变量也就是一个字符串,理解成 C 语言中的宏可能会更好。
 
比如,我们声明一个变量,叫 objects, OBJECTS, objs, OBJS, obj, 或是 OBJ,反正不管什么 啦,只要能够表示 obj 文件就行了。我们在 makefile 一开始就这样定义:   
 
于是,我们就可以很方便地在我们的 makefile 中以“$(objects)”的方式来使用这个变量了, 于是我们的改良版 makefile 就变成下面这个样子:
objects = aaa.o bbb.o main.o
abc:$(objects)
        gcc -o  abc $(objects)
main.o:main.c
        cc -c main.c
aaa.o:aaa.c aaa.h
        cc -c aaa.c
bbb.o:bbb.c bbb.h
        cc -c bbb.c
clean:
        rm  abc $(objects)
于是如果有新的 .o 文件加入,我们只需简单地修改一下 objects 变量就可以了。

2.使用隐式规则让makefile更简洁
GNU 的 make 很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没 必要去在每一个[.o]文件后都写上类似的命令,因为,我们的 make 会自动识别,并自己推 导命令。

只要 make 看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,如果 make 找到一 个 whatever.o,那么 whatever.c,就会是 whatever.o 的依赖文件。并且 cc -c whatever.c 也会 被推导出来,于是,我们的 makefile 再也不用写得这么复杂。我们的是新的 makefile 又出炉 了。
objects = aaa.o bbb.o main.o
abc:$(objects)
        gcc -o  abc $(objects)
main.o:
        cc -c main.c
aaa.o:aaa.h
        cc -c aaa.c
bbb.o:bbb.h
        cc -c bbb.c
clean:
        rm  abc $(objects)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值