1.简介
所谓工程管理器,是用于管理较多的文件。当项目文件很庞大时,修改其中的几个文件,gcc不得不把这些文件重新编译一边。而make工程管理器的作用正是为了解决这个问题,它能够根据文件的时间戳自动发现更新过的文件而减少编译的工作量。
2.Makefile基本结构
Makefile是make读入的唯一配置文件。在一个makefile中通常包含如下内容:
(1)需要由make工具创建的目标体(target),通常是目标文件或可执行文件;
(2)要创建的目标体所依赖的文件(dependency_files);
(3)创建每个目标体时需要运行的命令(command),这一行必须以制表符(Tab键)开头;
格式如下:
target:denpendcy_files
command /* 该行必须以Tab键开头 */
如:
hello.o: hello.c hello.h
gcc -c hello.c -o hello.o
接着在终端执行make hello.o命令,make将自动执行gcc -c hello.c -o hello.o,生成hello.o文件
3.makefile变量
(1)在makefile中的变量定义有两种方式:一种是递归展开方式,另一种是简单方式
1)递归展开方式:VAR=var
递归展开方式定义的变量是在引用该变量时进行替换的,即如果该变量包含对其他变量的引用,则在引用该变量时一次性将内嵌的变量全部展开。但是它也有严重的缺点,如不能在变量后追加内容(因为语句:CFLAGS=$(CFLAGS)-O在变量扩展过程中可能导致无穷循环)。
例如:
OBJS = kang.o yul.o
CC = gcc
CFLAGS = -Wall -O -g
david : $(OBJS)
$(CC) $(OBJS) -o david
kang.o : kang.c kang.h
$(CC) $(CFLAGS) -c kang.c -o kang.o
yul.o : yul.c yul.h
$(CC) $(CFLAGS) -c yul.c -o yul
2)简单扩展方式:VAR:=var
简单扩展方式变量的值在定义处展开,并且只展开一次,因此它不包含对其他变量的引用,从而消除变量的嵌套引用。
(2)makefile中的变量分为用户自定义、预定义变量、自动变量和环境变量
1)预定义变量包含了常见编译器、汇编器的名称及其编译选项
makefile中常见的预定义变量
预定义变量 |
含义 |
AR
库文件维护程序的名称,默认值为ar
AS
汇编程序的名称,默认值为as
CC
编译器的名称,默认值为cc
CPP
C预编译器的名称,默认值为$(CC) -E
CXX
C++编译器的名称,默认值为g++
FC
Fortran编译器的名称,默认值为f77
RM
文件删除程序的名称,默认值为rm -f
ARFLAGS
库文件维护程序的选项,无默认值
ASFLAGS
汇编程序的选项,无默认值
CFLAGS
C编译器的选项,无默认值
CPPFLAGS
C预编译器的选项,无默认值
CXXFLAGS
C++编译器的选项,无默认值
FFLAGS
Fortran编译器的选项,无默认值
2)自动变量
makefile中常见的自动变量
自动变量 |
含义 |
$*
不包含扩展名的目标文件名称
$+
所有依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$<
第一个依赖文件的名称
$?
所有时间戳比目标文件晚的依赖文件,并以空格分开
$@
目标文件的完整名称
$^
所有不重复的依赖文件,以空格分开
$%
如果目标是归档成员,则该变量表示目标的归档成员名称