一.隐式规则

问题一

.PHONY : all
all:
	@echo "command-1"
VAR:=test
all:
	@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.为编译得到的结果创建独立的文件夹