第18课 - make 中的路径搜索(下)
1. 问题一
当 VPATH 和 vpath 同时出现,make 会如何处理?
工程项目的目录结构如下图所示,src1 和 src2 中都包含了 func.c 文件,如果在 makefile 中使用 VPATH 指定了 src1 ,使用 vpath 指定了 src2,当 VPATH 和 vpath 同时存在时,make 会做出怎样的处理?
【编程实验】
1 #include <stdio.h> 2 #include "func.h" 3 4 void foo() 5 { 6 printf("void foo() : %s\n", "This file is from src1 ..."); 7 }
1 #include <stdio.h> 2 #include "func.h" 3 4 void foo() 5 { 6 printf("void foo() : %s\n", "This file is from src2 ..."); 7 }
1 VPATH := src1 # 使用VPATH指定src1 2 CFLAGS := -I inc 3 4 vpath %.c src2 #使用vpath指定src2 5 vpath %.h inc 6 7 app.out : func.o main.o 8 @gcc -o $@ $^ 9 @echo "Target File ==> $@" 10 11 %.o : %.c func.h 12 @gcc $(CFLAGS) -o $@ -c $<
执行 make 后的输出结果:
【实验结论】
make 搜索文件的次序如下:
make 首先在当前文件夹中搜索需要的文件,如果搜索失败,make 优先在 vpath 指定的文件夹中搜索目标文件,当 vpath 搜索失败时,转而搜索 VPATH 指定的文件夹。
2. 问题二
当使用 vpath 对同一个 Pattern 指定多个文件夹时,make 会如何处理?
工程项目的目录结构与问题一相同,src1 和 src2 中都包含了 func.c 文件,如果在 makefile 中使用 vpath 同时指定了两个src1 和 src2 两个目录,make 会做出怎样的处理?
【编程实验】
1 CFLAGS := -I inc 2 3 vpath %.c src1 4 vpath %.c src2 5 6 vpath %.h inc 7 8 app.out : func.o main.o 9 @gcc -o $@ $^ 10 @echo "Target File ==> $@" 11 12 %.o : %.c func.h 13 @gcc $(CFLAGS) -o $@ -c $< 14 15
执行 make 后的输出结果:(src1 出现在 src2 之前)
【实验结论】
当 makefile 中使用 vpath 对同一个 Pattern 指定了多个目录时,make 会以自上而下的顺序搜索 vpath 指定的文件夹,当找到目标文件时,搜索结束。
3. 问题三
注:本文整理于《狄泰12月提升计划》课程内容