变量的作用域
局部变量:在规则中声明的变量为局部变量。自动化变量是局部变量。
# 此时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”,这个变量中会存放你所指定的终极目标的列表
本文详细介绍了Makefile中的变量概念,包括局部变量、全局变量、自定义变量及自动化变量等。阐述了不同类型的变量如何被声明和使用,以及它们在Makefile中的作用域。此外,还解释了一些特殊变量的用法,如$@、$^和$+等,并探讨了如何通过模式匹配进行变量值的替换。
1933

被折叠的 条评论
为什么被折叠?



