Makefile学习(一)
Makefile学习
一、makefile书写规则
targets : prerequisites
command
相关说明如下:
targets:规则的目标,可以是 Object File(一般称它为中间文件),也可以是可执行文件,还可以是一个标签;
prerequisites:是我们的依赖文件,要生成 targets 需要的文件或者是目标。可以是多个,也可以是没有;
command:make 需要执行的命令(任意的 shell 命令)。可以有多条命令,每一条命令占一行。
命令的开始一定要使用Tab键。[^1]
二、makefile工作流程
在我们编译项目文件的时候,默认情况下,make 执行的是 Makefile 中的第一规则(Makefile 中出现的第一个依赖关系),此规则的第一目标称之为“最终目标”或者是“终极目标”。
三、makefile中通配符和自动化变量
通配符:
通配符 | 使用说明 |
---|---|
* | 匹配0个或者是任意个字符 |
? | 匹配任意一个字符 |
[] | $1 |
自动化变量:
自动化变量 | 说明 |
---|---|
$@ | 表示规则的目标文件名 |
$% | 当目标文件是一个静态库文件时,代表静态库的一个成员名 |
$< | 规则的第一个依赖的文件名 |
$? | 所有比目标文件更新的依赖文件列表,空格分隔 |
$^ | 代表的是所有依赖文件列表,使用空格分隔 |
$+ | 类似“$^”,但是它保留了依赖文件中重复出现的文件。主要用在程序链接时库的交叉引用场合 |
$* | 模式规则和静态模式规则中,代表“茎” |
四、makefile变量的定义与赋值
OBJ=main.o test.o test1.o test2.o
test:$(OBJ)
gcc -o test $(OBJ)
变量的名称可以由大小写字母、阿拉伯数字和下划线构成。
- 简单赋值 ( := ) 编程语言中常规理解的赋值方式,只对当前语句的变量有效。
- 递归赋值 ( = ) 赋值语句可能影响多个变量,所有目标变量相关的其他变量都受影响。
- 条件赋值 ( ?= ) 如果变量未定义,则使用符号中的值定义变量。如果该变量已经赋值,则该赋值语句无效。
- 追加赋值 ( += ) 原变量用空格隔开的方式追加一个新值。
五、makefile路径
VPATH:变量,更具体的说是环境变量,Makefile 中的一种特殊变量,使用时需要指定文件的路径。
vpath:关键字,按照模式搜索,也可以说成是选择搜索。搜索的时候不仅需要加上文件的路径,还需要加上相应限制的条件。
VPATH=src car
test:test.o
gcc -o $@ $^
vpath test.c src : car
test:test.o
gcc -o $@ $^
六、makefile伪目标
使用伪目标有两点原因:
1、避免我们的 Makefile 中定义的只执行的命令的目标和工作目录下的实际文件出现名字冲突。
2、提高执行 make 时的效率,特别是对于一个大型的工程来说,提高编译的效率也是我们所必需的。
先声明伪目标,再定义:
.PHONY:clean
clean:
rm -rf *.o test