文章目录
前言
在前面的文章中我们的文件全部都是放在同一个目录下面的,那么在实际的工程开发中会这样做吗?答案肯定是不会的,因为将全部的文件放在同一个目录下会显得十分凌乱,这样不便于代码的管理。
一、常用的源码管理方式
我们通常将各个模块的源码分开管理,并且将模块中的.c文件和.h文件也分开管理,这样便于我们代码的移植和管理。
那么通过这样管理后make怎么样来找到对应的文件在哪里呢?
二、VPATH和vpath
1.VPATH
VPATH 是 Make 中的一个变量,用于指定 Makefile 查找源文件的路径。当 Makefile 中需要使用一些源文件时,如果这些源文件不在当前目录下,则需要通过 VPATH 变量指定其他目录来查找这些源文件,以便编译生成目标文件。
在 Makefile 中,可以通过在 VPATH 变量中设置一系列目录路径来指定源文件的搜索路径。例如:
VPATH = src:../lib:../../include
上面的代码中,VPATH 变量指定了三个目录,用冒号分隔。Make 在查找源文件时,会先在当前目录下查找,如果找不到,就会依次在 VPATH 指定的目录中查找,直到找到为止。
通过 VPATH 变量,可以将源文件放在多个目录中,避免出现 “No such file or directory” 的错误,并且可以减少 Makefile 的编写工作,使 Makefile 的可读性和可维护性更好。同时,VPATH 还可以与通配符一起使用,更为方便地搜索源文件。
需要注意的是,VPATH 只用于指定源文件的搜索路径,而不影响生成目标文件的路径,如果想要更改生成的目标文件的路径,则需要使用其他机制,例如将变量 $@ 设置为所需的目标文件路径。
使用方法:
首先先在当前路径下创建makefile和src,inc这三个文件夹。并且在src中存放.c文件在inc中存放.h文件。
makefile:
这里使用VPATH指定了头文件和源文件的查找路径,那么为什么还需要使用-I选项来指定inc路径呢?
需要注意的是,在使用 VPATH 变量时,一般都需要通过 -I 选项来指定头文件的查找路径,这样才能让编译器正确地找到所需的头文件。
CC := gcc
VPATH := inc src
hello : main.c main.h
$(CC) -c -o $@ $< -I inc
2.vpath
vpath 也是 Make 中的一个变量,与 VPATH 功能类似,可以指定在哪些目录中查找匹配的文件。vpath 与 VPATH 的区别在于,它是一种模式化的路径指定方式,可以针对不同的文件类型指定不同的搜索路径。
在 Makefile 中,可以通过在 vpath 变量中设置文件模式和对应的目录路径来使用 vpath。例如:
vpath %.c src
vpath %.h include
vpath %.o obj
上面的代码中,vpath 指定了三种文件模式和对应的目录路径,% 表示通配符,匹配对应模式的文件名。Make 在查找符合模式的文件时,会先在当前目录下查找,如果找不到,就会按照 vpath 中指定的目录顺序依次查找,直到找到为止。
通过 vpath 可以更加灵活地指定不同类型的文件的搜索路径,避免了 VPATH 在搜索时搜索所有的文件类型的缺陷。在实际的编译过程中,可能需要指定各种文件类型的搜索路径,vpath 可以方便地解决这个问题。
与 VPATH 相同,在使用 vpath 时,也需要注意生成目标文件的路径,如果需要修改生成的目标文件的路径,需要在对应的目标规则中进行设置,例如使用 $@ 表示目标文件路径。
具体使用:
同样的在使用vpath时也需要使用-I来指定头文件路径。
CC := gcc
vpath %.h inc
vpath %.c src
hello : main.c main.h
$(CC) -c -o $@ $< -I inc
3.VPATH和vpath优缺点对比
VPATH 和 vpath 两个变量在 Makefile 中都用来指定文件的搜索路径,区别在于它们的作用范围和使用方式。
VPATH 变量:
优点:
可以指定 Make 在哪些目录中查找依赖文件,能够完全覆盖 Makefile 中的规则。
可以将源文件和依赖文件分开存放,方便管理和维护。
可以使用通配符匹配一类文件,并指定对应的目录路径。
缺点:
对于每一个 Make 规则,都需要手动添加 VPATH 变量,这会增加 Makefile 的复杂度。
在 Make进行依赖文件查找时,VPATH 会覆盖当前目录,这可能会对意图不明确的 Makefile 产生影响。
vpath 变量:
优点:
全局变量,避免了重复添加和修改变量的麻烦。
可以根据文件类型进行匹配,并指定对应的搜索路径。
使用简单,不用为每一个规则手动添加搜索路径变量。
缺点:
只能指定文件类型和目录路径,而不能针对特定的文件进行指定。
如果存在同名文件,可能会出现查找到错误文件的问题。
综上所述,VPATH 变量和 vpath 变量都有各自的优缺点,在实际使用时需要根据需求和具体情况选择。VPATH 变量可以精确控制每个规则需要查找的目录,但是使用起来比较繁琐;vpath 变量虽然使用简单,但是会受到同名文件的影响。
三、VPATH和vpath同时出现make会怎么处理
当在 Makefile 中同时出现 VPATH 和 vpath 两个变量时,它们的作用是相互独立的。
在查找依赖文件时,Make 会首先查找当前目录下是否存在所需的文件,如果不存在则会根据 vpath 变量指定的搜索路径查找文件,如果还是找不到则会根据 VPATH 变量指定的搜索路径查找文件。
所以make会优先选择在vpath指定的s搜索路径查找文件。
make会先在vpath指定的src路径下进行查找,当查找不到时再到VPATH指定的src1中进行查找。
CC := gcc
vpath %.h inc
vpath %.c src
VPATH := src1
hello : main.c main.h
$(CC) -c -o $@ $< -I inc
四、vpath指定多个文件夹
当使用 vpath 指定多个文件夹时,make 的行为会先在当前目录中查找所需要的文件,如果找不到,则会在指定的文件夹中按顺序查找,直到找到该文件或所有指定的文件夹都被查找完毕。
如果在多个指定文件夹中存在同名的文件,则 make 会按照指定的顺序查找这些文件夹,找到其中一个同名文件后就会停止查找。
这里使用vpath指定了src,src1,src2,make会按照顺序先在src下查找再到src1下查找,当查找到后就停止查找。
CC := gcc
vpath %.h inc
vpath %.c src
vpath %.c src1
vpath %.c src2
hello : main.c main.h
$(CC) -c -o $@ $< -I inc
总结
本篇文章讲解了make是如何进行路径搜索的,这个知识点在后面项目开发管理makefile的时候会起的非常大的作用,希望大家好好总结。