变量的作用域
局部变量:在规则中声明的变量为局部变量。自动化变量是局部变量。
# 此时CFLAGES的值是:-g prog: CFLAGES = -g
- 全局变量
赋值符号
= 赋值
:= 赋值,但不使用未定义的变量
+= 追加赋值
override 修饰符,用来保护变量的值。使用该修饰符的变量,其值无法在命令行中进行修改。
自定义变量
自定义的变量跟C语言中的宏一样,文件执行前要进行替换。声明时要赋初值,书写时字符串之间用空格隔开。
SRC_C = main.c add.c sub.c
变量可以用来相互赋值。甚至可以使用还未定义的变量进行赋值。
OBJ = $(patsubst %.c, %.o, $(SRC_C))
SRC_C = main.c add.c sub.c
避免使用未定义的变量进行赋值可以使用:=
。
# OBJ的值为空
OBJ := $(patsubst %.c, %.o, $(SRC_C))
SRC_C = main.c add.c sub.c
变量一些特殊的使用方法
赋值是进行替换
# 赋值时进行替换的两种方法 SRC_C = main.c add.c sub.c OBJ = $(SRC_C:.c=.o) # 通过**模式匹配**进行替换 OBJ = $(SRC_C:%.c=%.o)
类似宏的用法
# all的值为:Tony my_friend = Tony first = my second = friend all = $($a_$b)
自动化变量
在前面已经提到过,自动化变量为局部变量。
- $@:目标文件集,
sef.o
- $^:依赖文件集,删除了重复的文件名。
sef.c
$+:依赖文件集,未删除重复的文件名。
sef.o: sef.c gcc -c %^ -o $@
$<:依赖文件集,注意是一个一个的取出来。
add.c sub.c sef.c
# 假设当前目录下有`add.c sub.c sef.c`文件 add.o sub.o sef.o: %.o: %.c gcc -c %< -o %@
$*:“%”及其以前的部分。
- $?:比目标新的依赖文件集。
有特殊意义的变量
MAKECMDGOALS —— 这个变量中会存放你所指定的终极目标的列表,“MAKECMDGOALS”,这个变量中会存放你所指定的终极目标的列表