makefile不同模式的区别
前言
之前在工作中,本想使用自动化变量来构建目标文件,一直编不过去,就去了解了一下makefile的编译规则。
正文
关于自动化变量可以理解为由Makefile文件自动产生的变量。在模式规则中,规则的目标和依赖的文件名代表了一类的文件。规则的命令是对所有这一类文件的描述。我们在makefile中描述规则时,依赖文件和目标文件是变动的,显然在命令中不能出现具体的文件名称,否则模式规则将失去意义。
那么模式规则命令中该如何表示文件呢?就需要用到自动化变量,自动化变量的取值根据执行的规则来决定,取决于执行规则的目标文件和依赖文件。下面是对所有的自动化变量进行的说明:
自动化变量 | 说明 |
---|---|
$@ | 表示规则的目标文件名。如果目标是一个文档文件(Linux 中,一般成 .a 文件为文档文件,也成为静态的库文件),那么它代表这个文档的文件名。在多目标模式规则中,它代表的是触发规则被执行的文件名。 |
$% | 当目标文件是一个静态库文件时,代表静态库的一个成员名。 |
$< | 规则的第一个依赖的文件名。如果是一个目标文件使用隐含的规则来重建,则它代表由隐含规则加入的第一个依赖文件。 |
$? | 所有比目标文件更新的依赖文件,空格分隔。如果目标文件是静态库文件,则其代表的是库文件。 |
^ | 代表的是所有依赖文件列表,使用空格分隔。如果目标是静态库文件,它所代表的只能是所有的库成员名。一个文件可重复地出现在目标的依赖中,变量"^"只记录它的第一次引用的情况。就是说变量"$^"会去掉重复的依赖文件。 | |
+ | 类似"^",但是它保留了依赖文件中重复出现的文件。主要用在程序链接时库的交叉引用场合。 | |
$* | 在模式规则和静态模式规则中,代表“茎”。“茎”是目标模式中"%"所代表的部分(当文件名中存在目录时,“茎”也包含目录部分)。 |
简单介绍完自动化变量后,就到了今天的主题了—模式规则和静态模式规则
- 模式规则:
模式规则类似于普通规则。只是在模式规则中,目标名需要包含有模式字符 "%"(一个就够了)。包含有模式字符 "%" 的目标被用来匹配一个文件名,"%" 可以匹配任何非空字符串。规则的依赖文件中同样可以使用 "%" ,依赖文件中模式字符 "%" 的取值情况由目标中的 "%" 来决定。例如:对于模式规则 %.o:%.c 表示所有的 .o 文件依赖于对应的 .c 文件。模式规则可以用来定义隐含规则。 - 静态模式规则:
静态模式可以更加容易地定义多目标的规则,可以让我们的规则变得更加有弹性和灵活。
评论
0 评论