Makefile 介绍
———————
make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。
首先,我们用一个示例来说明Makefile的书写规则。以便给大家一个感兴认识。这个示例
来源于GNU的make使用手册,在这个示例中,我们的工程有8个C文件,和3个头文件,我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。我们的规则是:
1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这个头文件的所有C文件,并链接目标程序。
只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。
一、Makefile的规则
在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则。
target ... : prerequisites ...
【tab键】command
...
...
target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签
(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。
prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。(任意的Shell命令)
这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisi
tes中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是 Makefile的规则。也就是Makefile中最核心的内容。
说到底,Makefile的东西就是这样一点,好像我的这篇文档也该结束了。呵呵。还不尽然
,这是Makefile的主线和核心,但要写好一个Makefile还不够,我会以后面一点一点地结合我的工作经验给你慢慢到来。内容还多着呢。:)
二、示例:
第一步:新建makefile文件夹,在makefile文件夹下面添加需要整合的 .c文件
如:add.c文件(调用函数):
int add(int a,int b)
{
return a + b;
}
sub.c文件(调用函数):
int sub(int a,int b)
{
return a - b;
}
operator.c文件(主程序)
#include <stdio.h>
int main()
{
int a = 3;
int b = 2;
printf("%d %d\n",add(a,b),sub(a,b));
return 0;
}
第二步:建立makefile,vim makefile并添加规则,
格式target ... : prerequisites ...
【tab键】command
如:makefilew文件
版本1:
operator:add.c sub.c operator.c
gcc add.c sub.c operator.c -o operator
此版本作用是利用make命令将所有.c文件重新编译成.o文件
版本2:
operator:add.o sub.o operator.o
gcc add.o sub.o operator.o -o operator
add.o:add.c
gcc -c add.c -o add.o
sub.o:sub.c
gcc -c sub.c -o sub.o
opertor.o:operator.c
gcc -c operator.c -o operator.o
clean:
rm -f *.o operator
此版本的作用与版本1不同的是,利用make命令(make [修改过的文件名])将修改过的.c文件重新编译成.o文件,未修改的不用编译。这样大大提高了机器的运算效率。make clean命令是清除所有.o文件。
版本3:
OBJECT=add.o sub.o operator.o #定义变量
operator:$(OBJECT) #使用变量
cc $(OBJECT) -o operator
clean:
rm -f *.o operator
此版本进一步简化了操作程序,另外还利用le了makefile自动推导规则的作用
三、总结
makefile 是 make 读入的唯一配置文件,因此本节的内容实际就是讲述 Makefile 的编写规则。
1、makefile的基本格式:target:dependency
(Tab字符)command
注:若dependencyt比target日期新或target不存在,则make会执行command
2、makefile中变量的使用
OBJECTS = sum.o sub.o operator.o #定义变量
$(OBJECTS) #使用变量
3、makefile的自动推导(隐晦规则)
GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个[.o]文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中。如:如果make找到一个main.o,那么main.c就会是main.o的依赖文件。并且gcc -c main.c -o main.o也会被推导出来。