设为首页 加入收藏

TOP

3.6.3 Makefile文件示例
2013-10-12 06:50:04 来源: 作者: 【 】 浏览:72
Tags:3.6.3 Makefile 文件 示例

3.6.3  Makefile文件示例

下面我们讨论一个简单的Makefile文件,该文件描述了如何编译和链接一个由8个C源文件和3个头文件构成的文本编辑器程序。

当make依据Makefile文件中的内容重新编译C文件时,仅会对每个修改过的C文件进行重新编译。当然,如果一个.h头文件被修改过了,那么为了确保程序被正确编译,每一个包含该头文件的C代码文件都会被重新编译。每次编译操作都会产生一个与源程序对应的目标文件。最终结果是,若任何修改过的源代码文件被编译过,那么产生的所有.o目标文件(包括刚编译得到的和未修改源代码以前编译得到的)都需要链接在一起以生成一个新的可执行编辑器程序。

Makefile示例文件中的内容描述了一个名为edit的执行文件依赖于8个目标文件的方式,以及这8个目标文件又是如何依赖于8个C源文件和3个头文件的。在该例子中,所有C文件都包含了"defs.h"头文件,但只有那些定义了编辑命令的C文件包含"command.h",而且只有改变编辑缓冲的底层C文件包含"buffer.h"头文件。

edit : main.o kbd.o command.o display.o insert.
o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o
insert.o search.o files.o utils.o
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit main.o kbd.o command.o display.o
insert.o search.o files.o utils.o

要使用该Makefile创建执行文件"edit",只需在命令行上简单地键入 make 即可。

若要使用该Makefile从当前目录中删除编译得到的执行文件和所有目标文件,只需键入 make clean。

在该Makefile文件中,规则的目标包括执行文件"edit"和.o目标文件(object file)"main.o"、"kbd.o"等。先决条件(或依赖条件)文件是诸如"main.c"和"defs.h"等源文件。实际上我们可以看出,每个".o"文件既是一个规则的目标,也是另一规则的必要前提文件。而命令则包括"cc -c main.c"、"cc -c kbd.c"等。

当目标是一个文件时,那么当其先决条件中的任何依赖文件被修改过时就需要进行重新编译或链接。当然,先决条件中本身也是目标的文件应该首先加以更新。在该例子中,"edit"依赖于8个.o目标文件;而.o目标文件"main.o"依赖于源文件"main.c"和头文件"defs.h"。

Makefile中规则的目标和先决条件的下一行是shell命令。这些shell命令指明如何使用先决条件中的文件来更新或生成target目标文件。注意,我们需要在每个命令行之前键入一个制表符,以区别Makefile中的命令行和其他行。make所做的就是当target需要更新时执行规则中的命令。

目标"clean"并不是一个文件,而仅是一个操作(活动)的名称。因为我们通常并不要求在其规则中执行该操作,所以"clean"不是任何其他规则的先决条件。其结果是若不明确指明,make不会执行这个规则。注意该规则(目标)不仅不是任何其他规则的先决条件,它也不包含也不需要任何先决条件。因此这个规则的唯一目的就是去执行指定的命令。对于此类规则,其目标并不引用或依赖任何其他文件,而仅指明特定的操作,这种目标称为伪目标(phony target)。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇3.6.5 Makefile中的变量 下一篇嵌入式Linux上的C语言编程实践 前..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: