任务描述
本关任务:学习Makefile
中的变量的定义和使用,以及常用的特殊变量使用。
相关知识
变量的使用可以方便我们编写makefile
文件,我们可以使用一个简短的变量来替换一个比较长的字符串,这样我们在使用这个字符串的时候就可以方便的使用变量来替换。除此之外,当我们修改某一个字符串时,如果我们没有使用变量,则我们需要修改使用该字符串的每个地方,如果使用了变量,我们只需要修改变量定义处即可。
makefile
变量的命令可以包含字符、数字、下划线(可以是数字开头),并且大小写敏感。
makefile
变量在声明时需要对其进行赋值,而在使用该变量时需要在变量名前加上**$
符号 例如$(VARNAME)
,如果用户需要在makefile
文件中使用真实的$
字符,则使用$$
**表示。
makefile
中对变量的赋值方式有三种,分别是:
递归赋值(=):递归赋值,即赋值后并不马上生效,等到使用时才真正的赋值,此时通递归找出当前的值;
直接赋值(:=):是将":="右边中包含的变量直接展开给左边的变量赋值;
条件赋值(?=):只有此变量在之前没有赋值的情况下才会对这个变量进行赋值,所有一般用在第一次赋值;
makefile
除了可以自定义变量外,还存在一些系统默认的特殊变量,这些特殊变量可以方便帮助我们快速的编写makefile
文件,例如:$@、$<和$^
等等。
本关将介绍makefile
的变量的定义和使用方法,以及使用特殊变量来编写makefile
文件。
Makefile 自定义变量
自定义变量格式:
- 递归赋值
变量名 = 变量内容
- 直接赋值
变量名 := 变量内容
- 条件赋值
变量名 ?= 变量内容
变量的使用格式为: $变量名
或者${变量名}
或者$(变量名)
案例演示1:
在上一关中案例2
中的项包含了5
个源码文件和一个头文件,如果使用变量来编写makefile
则会显示出比较简洁的格式,具体操作如下:
vim makefile
make
- vim makefile
object=main.o Add.o Sub.o Mul.o Div.o
exe : $(object)
gcc -o exe $(object)
main.o : main.c def.h
gcc -c main.c -o main.o
Add.o : Add.c
gcc -c Add.c -o Add.o
Sub.o : Sub.c
gcc -c Sub.c -o Sub.o
Mul.o : Mul.c
gcc -c Mul.c -o Mul.o
Div.o : Div.c
gcc -c Div.c -o Div.o
[makefile
内容]
[请在右侧“命令行”里直接体验]
可以看到,我们使用object
来表示main.o Add.o Sub.o Mul.o Div.o
,这样我们就可以使用$(object)
来表示以上目标文件,而不是每次输入这5
个目标文件。
Makefile 特殊变量
makefile
常用的特殊变量有:
$@:表示所有目标;
$^:表示所有依赖目标的集合,以空格分隔;
$<:表示依赖目标中第一个目标的名子;
案例演示1:
接着上一个案例中的项目,如果使用特殊变量来编写makefile
则会显示出更加简洁的格式,具体操作如下:
vim makefile
make
- vim makefile
object=main.o Add.o Sub.o Mul.o Div.o
exe : $(object)
gcc -o $@ $(object)
main.o : main.c def.h
gcc -c $< -o $@
Add.o : Add.c
gcc -c $< -o $@
Sub.o : Sub.c
gcc -c $< -o $@
Mul.o : Mul.c
gcc -c $< -o $@
Div.o : Div.c
gcc -c $< -o $@
[请在右侧“命令行”里直接体验]
编程要求
本关任务是学会使用makefile
来编译项目。
具体编程要求如下:
- 编写
5
个源文件Add.c、Sub.c、Mul.c、Div.c和main.c和一个头文件def.h,文件内容同第一关案例2
; - 使用
makefile
的变量来编译生成一个名为VarCalc
的可执行文件;
测试说明
本关的测试需要用户在右侧的命令行下完成,用户只需将需要完成的命令在右侧命令行下直接操作即可,然后点击评测按钮,平台会自动验证用户是否按照要求去检测结果。
Ways
其实是和第一关大差不差 唯一不同的是引入了Makefile 特殊变量