background image

 

当然由于这个程序是很短的我们可以这样来编译 gcc -c main.c gcc -c mytool1.c 

gcc -c mytool2.c gcc -o main main.o mytool1.o mytool2.o 这样的话我们也可以产
生 main 程序,而且也不时很麻烦.但是如果我们考虑一下如果有一天我们修改了其中的一
个文件(比如说 mytool1.c)那么我们难道还要重新输入上面的命令?也许你会说,这个很
容易解决啊,我写一个 SHELL 脚本,让她帮我去完成不就可以了.是的对于这个程序来说,
是可以起到作用的.但是当我们把事情想的更复杂一点,如果我们的程序有几百个源程序的
时候,难道也要编译器重新一个一个的去编译? 为此,聪明的程序员们想出了一个很好的工
具来做这件事情,这就是 make.我们只要执行一下 make,就可以把上面的问题解决掉.在
我们执行 make 之前,我们要先编写一个非常重要的文件.--Makefile.对于上面的那个程
序来说,可能的一个 Makefile 的文件是: # 这是上面那个程序的 Makefile

 

文件

main:main.o mytool1.o mytool2.o 

gcc -o main main.o mytool1.o mytool2.o 

main.o:main.c mytool1.h mytool2.h 

gcc -c main.c 

mytool1.o:mytool1.c mytool1.h 

gcc -c mytool1.c 

mytool2.o:mytool2.c mytool2.h 

gcc -c mytool2.c 

有了这个 Makefile 文件,不过我们什么时候修改了源程序当中的什么文件,我们只要

 

执行 make 命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件
她连理都不想去理的. 

下面我们学习 Makefile 是如何编写的. 在 Makefile 中#开始的行都是注释

行.Makefile 中最重要的是描述文件的依赖关系的说明.一般的格式是: 

target: components 

TAB rule 

第一行表示的是依赖关系.第二行是规则. 比如说我们上面的那个 Makefile 文件的第

 

二行 main:main.o mytool1.o mytool2.o 表示我们的目标(target)main 的依赖对象
(components)是 main.o mytool1.o mytool2.o 当倚赖的对象在目标修改后修改的话,
就要去执行规则一行所指定的命令.

 

就象我们的上 面那个 Makefile 第三行所说的一样要

 

执行 gcc -o main main.o mytool1.o mytool2.o 注意规则一行中的 TAB 表示那里是
一个 TAB

 

键 Makefile 有三个非常有用的变量.分别是$@,$^,$<代表的意义分别是: $

@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件. 如果我们使用上面三个变量,那
么我们可以简化我们的 Makefile 文件为: # 这是简化后的 Makefile 

main:main.o mytool1.o mytool2.o 

gcc -o $@ $^ 

main.o:main.c mytool1.h mytool2.h