目录
1.问题一:
当VPATH和vpath同时出现时,make会如何处理?
2.下面的项目中会选择哪一个文件进行编译?
3.实验结论
- make首先在当前文件夹搜索需要的文件
- 如果失败:
make优先在vpath指定的文件夹中搜索目标文件
当vpath搜索失败时,转而搜索VPATH指定的文件夹
将src2里面的fun.c重命名为fun.cpp
下面的这种情况我没测试出来:(当然也用可能是环境不一样导致的)
将src1也改为fun.cpp,先去vpath找,再去VPATH找,没找到,make就会使用隐士规则:可以找有没有.cpp,首先在当前目录下找,没找到在去vpath下找,makefile中vpath指定的是.c,没有指定.cpp去哪里找,又去VPATH下面找,结果找到了,然后就通过g++编译,但是隐士规则又没有指定去哪里找.h,所以报错找不到.h文件
我觉得应该是makefile中根本就没有定义.cpp去哪里找,所以直接是报找不到.c文件,这是我测试出来的结果。问题二中视频就是这样的情况。
4.问题二
当使用vpath对同一个Pattern指定多个文件夹时,make会如何处理?
5.下面的项目中会选择哪一个文件进行编译?
6.实验结论
- make首先在当前文件夹搜索需要的文件
- 如果失败
make以自上而下的顺序搜索vpath指定文件夹
当找到目标文件搜索结束
7.问题三
通过VPATH指定搜索路径后,make如何决定目标文件的最终位置?
8.下面的项目中将如何生成可执行程序?
9.实验结论
- 当app.out完全不存在:
make在当前文件下创建app.out
- 当src文件夹中存在app.out
所有目标和依赖的新旧关系不变,make不会重新创建app.out
当前依赖文件被更新,make在当前文件夹下创建app.out
把生成的app.out移到src目录,在make
修改以下src/func.c
因make对文件路径的处理是非常弱的,所以经常会做出错误决定。
10.问题
当依赖改变时,如何使得src下的app.out被更新?
11.解决方案
- 使用GPATH特殊变量指定目标文件夹
- GPATH:=src
当app.out完全不存在
make默认在当前文件夹创建app.out
当app.out存在于src,且依赖文件被更新
make在src中创建app.out
将app.out移到src中我们改下func.c
12.工程项目中的几点建议
- 尽量使用vpath为不同文件指定搜索路径
- 不要在源码文件夹中生成目标文件
- 为编译得到的结果创建独立的文件夹避免VPATH和GPATH特殊变量的使用