介绍
一般程序都是由多个源文件编译链接而成的,这些源文件的处理步骤通常由Makefile文件管理。
索引
1、
用途
1)
准备
2)
方便使用
3)
原理
4)
格式
5)
案例
2、
规则
3、
Makefile中的变量
1)
作用
2)
语法
3)
案例
4、
伪目标
5、
条件语句
6、
调试make
7、
参考文献
make工具用来进行协调的工具,可以根据程序模块的修改情况重新编译链接目标代码,以保证目标代码总是由它的最新模块组成。
要使用make,准备Makefile的文件(也可以准备其他文件如GNUMakefile或makefile,推荐使用Makefile),它描述了软件包中各个文件之间的关系,提供了更新每个文件的命令。
当一个适当的Makefile存在时,每次改变某些源文件,用简单的shell命令(make),将足以完成所有必需的重新编译。
make 程序利用Makefile的数据和每个文件最新一次更改的时间来确定哪些文件需要更新;对每个需要更新的文件,make程序使用Makefile中定义的命令来更新它。
#用“井”号表明注释。
target(要生成的文件): dependencies(被依赖的文件)
#命令前面用的是“tab”而非空格。误用空格是初学者容易犯的错误!
命令1
命令2
命令3
.
.
.
命令n
#可以使用“\”表示续行。注意,“\”之后不能有空格!
- target通常是我们要生成的文件的名字,摆放的顺序不重要,但第一个target是默认的target。当make不带参数时,自动执行第一个target。target也可以是要求make完成的动作,执行这种target后并不能得到和target同名的文件,因此,也称为伪target(phony target)。
- dependencies是生成target所需的文件名列表。依赖可以为空,常用的“clean”target就常常没有依赖,只有命令。
- 命令可以是任何一个shell能运行的命令。
比如生成exe文件,它由2个目标代码某块组成,分别为module1.o和module2.o
module1.h文件
int module1 = 1;
module1.c文件
#include "module1.h"
void print1(){
printf("var module1:%d\n", module1);
}
module2.h文件
int module2 = 2;
module2.c文件
#include <stdio.h>
#include "module2.h"
void print2(){
printf("var module2:%d\n", module2);
}
int main(){
print1();
print2();
return 0;
}
编译
Makefile文件
exe:module2.o module1.o
gcc -g module1.o module2.o -o exe
module2.o:module2.h module2.c
gcc -g -c module2.c
module1.o:module1.h module1.c
gcc -g -c module1.c
clean:
rm -f exe *.o
截图
在编写完源程序文件后,从中生成需要的Makefile规则。
最基本的编写规则的方法是从最终的源程序文件开始一个一个的查看源码文件,把它们要生成的目标文件做为目标,而C语言源码文件和源码文件包含的头文件作为依赖文件生成规则。
目标和条件之间的关系是:
欲更新目标,必须首先更新它的所有条件;所有条件中只要有一个条件被更新了,目标也必须随之被更新。所谓“更新”就是执行一遍规则中的命令列表,命令列表中的每条命令必须以一个Tab开头,注意不能是空格,Makefile的格式不像C语言的缩进那么随意,对于Makefile中的每个以Tab开头的命令,make会创建一个Shell进程去执行它。
变量:“变量”指的是用一个字符串代替另一个字符串的功能。在makefile中可以使用“=”号来定义变量,使用“$(变量名)”来使用变量;还可以用“:=”追加变量的内容。习惯上,变量名使用大写。
定义:
变量名=字符串
使用:
$(变量名)
追加:
变量名:=字符串
OBJS=module1.o module2.o
C=-c
CC=gcc
exe:$(OBJS)
$(CC) -g $(OBJS) -o exe
module2.o:module2.h module2.c
$(CC) -g $(C) module2.c
module1.o:module1.h module1.c
$(CC) -g $(C) module1.c
clean:
rm -f exe *.o
放例子:
all:exe1 exe2
exe1:exe1.c exe1.h
gcc exe1.c -o exe1
exe2:exe2.c exe2.h
gcc exe2.c -o exe2
clean:
rm -f exe*
其中的all和clean都为伪目标。伪目标文件是不存在的。注意上面例子中第一条规则下的命令行为空,make不会执行任何动作,只是检查依赖文件的更新情况, 扫描剩下的几条规则并执行相应的编译命令生成可执行文件。
条件语句可以将一个变量与其他变量的值进行比较,或将一个变量与一个字符串常量相比较。——这样就可以根据变量的值执行或忽略Makefile文件中的一部分脚本。
注意:条件语句用于控制make时间看见的Makefile文件部分,而不能用于执行时控制shell命令。
条件语句3条指令:ifeq, else 和endif
放样例:
ifeq($(VAR), 1)
gcc -o exe1 module
else
gcc -o exe2 module
endif
推荐