工程管理器-make
make是一个自动编译管理器,能够根据文件
时间戳
自动发现更新过的文件从而减少编译的工作量,同时,它通过读入Makefile文件的内容来执行大量的编译工作,用户只需要编写一次简单的编译语句即可。
1. Makefile基本结构
Makefile用来告诉make如何编译和链接一个程序,它是make读入的唯一配置文件。
Makefile中最重要的元素-规则。
规则的语法:
Target:
prerequisites
@commands
Target: 目标文件,可执行文件或是一个标签
Prerequisites
:要创建目标体所依赖的文件,或者是其他目标
Command
:创建每个目标体时需要的运行的命令
Note
:
1
)
command
前的
@
是表示不打印出命令
2
)
command
前必须要有一个“
Tab
”符
2. Makefile中变量
Makefile中的变量使用格式为$(VAR)
1. 变量赋值
1)
递归扩展方式
:在引用该变量时进行替换,即如果该变量包含了对其他变量的引用,则在引用该变量时递归地将内嵌的变量全部展开。形如:
objects = main.o foo.o bar.o utils.o
2)
简单扩展方式
:递归扩展方式定义的变量存在一个严重的缺点,就是不能在变量后面追加内容,因为语句“CFLAGS = $(CFLAGS) -O”在变量扩展中可能导致无限循环。为了避免这种问题发生,引入简单扩展方式;变量赋值,make只对其进行一次扫描和替换。形如:
objects := $(objects) another.o
3)其他赋值方式
条件赋值
:
当变量以前没有定义时,就定义它并且将右边的值赋值给它,如果已经定义了那么就不再改变其值。形如:
CROSS_COMPILE
?= arm-none-linux-gnueabi-
追加赋值
:变量在之前已经赋值,想追加一些内容给它。形如:
objects = main.o foo.o bar.o utils.o
objects += another.o
2. 预定义变量
命令格式 |
含义 |
AR |
库文件维护程序的名称,默认值为ar |
AS |
汇编程序的名称,默认值为as |
CC |
C编译器的名称,默认值cc |
CPP |
C预编译器的名称,默认值值$(CC) -E |
CXX |
C++编译器的名称,默认值为g++ |
FC |
FORTRAN编译器的名称,默认值f77 |
RM |
文件删除程序的名称,默认值为rm -f |
ARFLAGS |
库文件维护程序的选项,无默认值 |
ASFLAGS |
汇编程序的选项,无默认值 |
CFLAGS |
C编译器的选项,无默认值 |
CPPFLAGS |
C预编译的选项,无默认值 |
CXXFLAGS |
C++编译器的选项,无默认值 |
FFLAGS |
FORTRAN编译器的选项,无默认值 |
3. 自动变量
命令格式 |
含义 |
$* |
不包含扩展名的目标文件名称 |
$+ |
所有的依赖文件,可能包含可重复文件 |
$< |
第一个依赖文件的名称 |
$? |
所有时间戳比目标文件晚的依赖文件 |
$@ |
目标文件的完整名称 |
$^ |
所有不重复的依赖文件,以空格分开 |
$% |
表示目标的归档成员名称 |
Note:
在
Makefile
中还有几个特殊变量,我们可能经常需要用到。 第一个就是
MAKE
变量,它表示的是
make
命令名是什么。 当我们需要在
Makefile
中调用另一个
Makefile
时需要用到这个变量, 采用这种方式,有利于写一个容易移植的
Makefile
。
3. Makefile 规则
1. 隐式规则
隐式规则能告诉make怎样使用传统的技术完成任务,这样,当用户使用它们是不必详细指定编译的具体细节,而把目标文件列出即可。形如:
…
main.o: main.c defs.h
command.o: command.c defs.h command.h
…
在上面的Makefile文件中,我们省略了规则的命令“$(CC) $(CFLAGS) -c $< -o $@”
Makefile中常见隐式规则目录
对应语言后缀名 |
规则 |
C编译:“.c”变为“.o” |
$(CC) -c $(CPPFLAGS) $(CFLGAS) |
C++编译:“.cc”或“.C”变为“.o” |
$(CXX) -c $(CPPFLAGS) $(CXXFLGAS) |
Pascal 编译:“.p”变为“.o” |
$(PC) -c $(PFLGAS) |
Fortran 编译:“.r”变为“.o” |
$(FC) -c $(FFLGAS) |
2. 模式规则
模式规则不同于隐式规则,是用来定义处理相同的多个文件的规则,模式规则能引入用户自定义变量,为多个文件建立相同的规则。 形如:
…
%.s:%.S
#预处理
$(CPP) $(AFLAGS) $(CFLAGS) $< -o $@
%.o:%.S
#预处理+编译+汇编
$(CC) $(AFLAGS) $(CFLAGS) $< -o $@ -c
%.o:%.c
#预处理+编译+汇编
$(CC) $(CFLAGS) $< -o $@ -c
%.i:%.c
#预处理
$(CPP) $(CFLAGS) $< -o $@
%.s:%.c
#编译
$(CC) $(CFLAGS) $< -o $@ -S
%.o:%.s
#编译
$(AS) $(AFLAGS) $(CFLAGS) $< -o $@
…
4. make使用
make常用的命令行选项
命令格式 |
含义 |
-C dir |
读入指定目录下的Makefile |
-f file |
读入当前目录下的file文件作为Makefile |
-i |
忽略所有的命令执行错误 |
-I dir |
指定被包含的Makefile所在目录 |
-n |
只打印要执行的命令,但不执行这些命令 |
-p |
显示make变量数据和隐式规则 |
-s |
在执行命令时不显示命令 |
-w |
如果执行过程中改变目录,打印当前目录 |