在Makefile中使用变量
Makefile文件可以像C一样使用变量。变量的命名字可以包含字符、数字,下划线(可以是数字开头),但不应该含有 : 、 # 、 = 或是空字符(空格、回车等)。变量是大小写敏感的,“foo”、“Foo”和“FOO”是三个不同的 变量名。这里看一个例子:
objects = program.o foo.o utils.o
program : $(objects)
cc -o program $(objects)
$(objects) : defs.h
相当于
program : program.o foo.o utils.o
cc -o program program.o foo.o utils.o
program.o foo.o utils.o : defs.h
这里给变量赋值一共有4种符号:=
,=
,?=
和+=
。
先说比较简单的?=
如果之前定义了该变量,那么就什么也不做,例:
foo=123
foo?=456
#$(foo)=123
接着是+=
,跟C语言中的连接字符串strcat一个意思。直接看例子:
foo=test1.c test2.c
foo+=test3.c
#$(foo)=test1.c test2.c test3.c
最后就是=
和:=
两个都是表示赋值,但是:=
表示的是立即赋值而=
表示的是延时赋值。这么说可能有点不太明白,我们直接看一个例子:
x = sb;
y = u$(x)
x = all
#$(y)=uall
x := sb;
y := u$(x)
x := all
#$(y)=usb
在项目中,为了书写的方便,往往在命令中使用自动化变量,例:
OBJS = kang.o yul.o
CC = gcc
CFLAGS =-Wall -O -g
david : $ (OBJS)
$(CC) $^ -o $@
kang.o : kang.c kang.h
$(CC) $(CFLAGS) -c $< -o $@
yul.o : yul.c yul.h
$(CC) $(CFLAGS) -c $< -o $@
相当于:
OBJS = kang.o yul.o
CC = gcc
CFLAGS =-Wall -O -g
david : kang.o yul.o
gcc kang.o yul.o -o david
kang.o : kang.c kang.h
gcc Wall -O -g -c kang.c -o kang.o
yul.o : yul.c yul.h
gcc Wall -O -g -c -c yul.c -o yul.o
下面介绍一些常用的自动化变量:
-
$ @
表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配与目标中模式定义的集合。 -
$*
不包含扩展名的目标文件名称 -
$+
所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件 -
$<
第一个依赖文件的名称 -
$?
所有时间戳比目标文件晚的依赖文件,并以空格分开 -
$^
所有不重复的依赖文件,以空格分开 -
$%
如果目标是归档成员,则该变量表示目标的归档成员名称