千家信息网

make--隐式规则 路径搜索及实例

发表于:2024-11-27 作者:千家信息网编辑
千家信息网最后更新 2024年11月27日,一.隐式规则问题一.PHONY : allall: @echo "command-1"VAR:=testall: @echo "all:$(VAR)"make之后的结果如图所示可以得出的结
千家信息网最后更新 2024年11月27日make--隐式规则 路径搜索及实例

一.隐式规则

问题一

.PHONY : allall:    @echo "command-1"VAR:=testall:    @echo "all:$(VAR)"

make之后的结果如图所示

可以得出的结论是
A.makefile中出现同名目标时
依赖:所有的依赖将合并在一起,成为目标的最终依赖
命令:当多处出现同一目标时,make发出警告;所有之前定义的命令被最后定义的命令取代
注意:当使用include关键字包含其他文件时,需要确保被包含文件中的同名目标只有依赖,没有命令;否则,同名目标的命令将被覆盖

隐式规则
1.make提供了一些常用的,例行的规则实现
2.当相应目标的规则未提供时,make尝试隐式规则
3.make提供了生成目标文件的隐式规则
4.隐式规则会使用预定义变量完成编译工作
5.改变预定义变量将部分改变隐式规则的行为
6.当存在自定义规则时,不再使用隐式规则

深入理解隐式规则
A.当make发目标的依赖不存在时
1.尝试通过依赖名逐一查找隐式规则
2.并且通过依赖名推导可能需要的源文件

隐式规则的副作用
1.编译行为难以控制--大量使用隐式规则可能产生意想不到的编译行为
2.编译效率低下--make从隐式规则和自定义规则中选择最终使用的规则
隐式规则链
当依赖的目标不存在时,make会极力组合各种隐式规则对目标进行创建,进而产生意料之外的编译行为---需要名为N.o的目标:N.y->N.c>N.o
查看隐式规则

隐式规则的禁用
A.局部禁用
1.在makefile中自定义规则
2.在makefile在定义模式(如:%.o:%.p)
B.全局禁用
make -r

后缀规则的简介
1.后缀规则是旧式的"模式规则"
2.可以通过后缀描述的方式自定义规则

双后缀规则--定义一对文件后缀(依赖文件后缀和目标文件后缀),如:.cpp<==>%.o:%.cpp
单后缀规则--定义单个文件后缀(源文件后缀),如.c<==>%:%.c
关于后缀规则的注意事项
1.后缀规则中不允许有依赖
2.后缀规则必须有命令,否则无意义
3.后缀规则逐步被模式规则取代

小结:
1.当多处出现同一目标的命令时,只有最后定义的命令有效
2.make提供了一系列的而隐式规则可使用
3.当makefile中未定义相关规则时,尝试使用隐式规则
4.隐式规则中可能使用make中的预定义变量
5.改变预定义变量可部分改变预定义规则的行为
6.隐式规则可能造成意想不到的编译行为
7.在实际工程项目中尽量不使用隐式规则
8.后缀规则是一种旧式的模式规则
9.后缀规则正逐步被模式规则取代

二.路径搜索

A.常用的源码管理方式


项目中的makefile必须能够正确的定位源文件和依赖文的文件,最终编译可执行程序代码如下图

如图所示:inc文件夹是头文件,而src文件夹是源文件,makefile文档程序如图所示,make之后的结果如图所示

生成该结果的原因是在当前文件夹中不存在func.c
特殊的预定义变量VPATH(全大写)
1.VPATH变量的值用于指示make如何查找文件
2.不同文件夹可作为VPATH的值同时出现
3.文件夹的名字之间需要用分隔符进行区分

make对于VPATH值的处理方式
1.当前文件找不到需要的文件时,VPATH会被使用
2.make会在VPATH指定的文件夹中依次搜索文件
3.当多个文件夹存在同名时,选择第一次搜索到的文件
注意事项:
1.VPATH只能决定make的搜索路径,无法决定命令的搜索路径
2.对于特定的编译命令(gcc),需要独立指定编译搜索路径
3.

对之前示例的修改及运行结果如图所示

VPATH存在的问题--当inc文件夹意外出现源文件(C/Cpp文件),那么可能产生编译错误
替换方案:vpath关键字(全小写)
1.为不同类型的文件指定不同的搜索路径
2.语法--在Directory中搜索符合Pattern的规则的文件

运行的实例及运行结果如图所示

取消搜索规则:
1.取消已经设置的某个搜索规则
.vpath Pattern

2.取消所有已经设置的规则
.vpath

三 路径搜索的几个问题

问题1:当VPATH和vpath同时出现时,make会如何处理

运行的实例及结果图

当把src2中的func.c改成func.cpp再次进行make
运行的结果

对比得出的结论
1.make首先在当前文件夹搜索需要的文件
2.如果失败
a.make优先在vpath指定的文件夹中搜索目标文件
b.当vpath搜索失败时,转而搜索VPATH指定的文件夹

问题2--当使用vpath对同一个Pattern指定多个文件夹时,make会如何处理

实例及运行结果如图所示

结论:
1.make首先在当前文件夹搜索需要的文件
2.如果失败
a.make以自上而下的顺序搜索vpath指定的文件夹
b.当找到目标文件,搜索结束

问题3--通过VPATH指定搜索路径后,make如何决定目标文件的最终位置

将第一次运行的结果生成的app.out放置src文件夹下的运行make结果图如图所示

结论:
1.当app.out完全不存在--make在当前文件夹下创建app.out
2.当src文件夹中存在app.out--所有目标和依赖的新旧关系不变,make不会重新创建app.out;当依赖文件被更新,make在当前文件夹下创建app.out

四 小结:

1.VPATH变量用于指示make如何查找文件
2.make会在VPATH指定的文件夹中依次搜索文件
3.vpath关键字可以为不同类型的文件指定不同的搜索路径
4.vpath比VPATH更灵活易用,可动态设置/取消搜索路径
5.尽量使用vpath为不同文件指定搜索路径
6.不要在源码文件夹中生成目标文件
7.为编译得到的结果创建独立的文件夹

0