EXE = main OBJ = hello.o hello1.o SRC = hello.c hello1.c SRC += hello2.c CC = gcc CFLAGS = -g LDFLAGS = -L . -lFOO EXE:$(OBJ) $(CC) $(LDFLAGS) -o $(EXE) $^ OBJ:$(SRC) $(CC) $(CFLAGS) -o $(OBJ) -c $^ .PHONY:clean clean: -$(RM) $(OBJ) $(EXE)
其中CC CFLAGS LDFLAGS RM等称为预定义变量,其中有些有默认值有的没有默认值。
而EXE OBJ SRC都称为变量,变量可以通过=赋值(EXE = main)或者通过+=追加(SRC += hello2.c)。
用到变量的地方使用$(变量)引用。变量的功能相当于替换
常见预定义变量如下:
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 编译器的选项,无默认值
$^这类变量称为自动变量,自动变量不用定义,且随着系统环境变量而改变。自动变量同时也会覆盖掉环境变量。
$* 不包含扩展名的目标文件名称
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含 重复的依赖文件
$< 第一个依赖文件的名称
$? 所有时间戳比目标文件晚的依赖文件,并以空格分开
$@ 目标文件的完整名称
$^ 所有不重复的依赖文件,以空格分开
$% 如果目标是归档成员,则该变量表示目标的归档成员名称
.PHONY称为伪目标,.PHONY:clean,当出现有文件为clean时,make不能运行,所以引入伪目标。
这个目标为一个标签,只执行命令,不出创建目标。