概述:所谓工程管理器,是指管理较多的文件。人们通过利用Make工具来自动完成编译工作。这些工作包括:如果仅修改了某几个源文件,则只重新编译这几个源文件;如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。利用这种自动编译可大大简化开发工作。Make工具通过Makefile文件来完成自动维护编译工作。Makefile主要定义了源文件之间的倚赖关系,说明了如何编译各个源文件并连接生成可执行文件。GNU Make工具当前目录中按如下顺序搜索Makefile:
GNUmakefile;
makefile;
Makefile。
使用Make管理器,在make命令后键入目标名;如直接运行make,则建立Makefile中的第一个目标。在UNIX中习惯使用Makefile作为Makefile文件。Makefile文件就像一个Shell脚本,其中也可以执行操作系统命令。
Makefile中语句的格式:
target : dependency_files
<tab>command
注意:在Makefile中的每一个command前必须有Tab符,否则出错。
例子:
/************hello.c*****************/
#include<stdio.h>
#include"hello.h"
void printHello(){
printf("Hello!\n");
}
void main() {
printHello();
}
/************hello.h*****************/
void printHello();
/************Makefile*****************/
hello : hello.o
gcc hello.o -o hello
hello.o : hello.c hello.h
gcc -c hello.c -o hello.o
clean :
rm *.o hello
Makefile中 '#' 开头为注释行,如果一行写不完则可使用 '\' 换行续写。clean是一个动作的名字,类似label
$ make clean
将删掉目录中的hello.o和hello文件。
当只输入make命令时,会在当前目录找名字为Makefile的文件,若找到,就会寻找文件中的第一个目标文件,将其作为最终目标文件。
1. Makefile变量
推荐使用小写字母作为变量名,预留大写字母作为控制隐含规则参数或用户重载命令选项参数的变量名
Makefile中变量定义有两种方式:一种是递归展开方式,另一种是简单方式。递归展开方式一次性将内嵌变量全部展开,可能导致无穷循环,如CFLAGS=$(CFLAGS) -O 。简单展开方式只展开一次。
递归展开方式的定义格式:VAR=var 。
简单展开方式的定义格式:VAR:=var 。
Make中的变量格式为 $(VAR)
Makefile中变量分为用户自定义变量,预定义变量,自动变量,环境变量。
预定义变量如AR,AS,CC,CPP,CXX,RM,ARFLAGS,ASFLAGS,CFLAGS,CPPFLAGS,CXXFLAGS。
自动变量可以代表编译语句中出现的目标文件和依赖文件等,并且具有本地含义(即下一语句中出现的相同变量代表的是上一语句的目标文件和依赖文件)。如
$* 不包含扩展名的目标文件,$+,$<,$?,$@,$^,$% 。
环境变量。可以使用系统环境变量。
2. Makefile规则
2.1隐式规则
如可以将.c 变为 .o
2.2模式规则
自定义规则,如将.c 变为 .o
%.o : %.c
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ @<
3. 自动生成Makefile文件
可以使用autotools工具生成configure文件,通过执行configure命令即可生成Makefile文件。