Makefile基础教程(路径搜索)
  micz61TEX78l 2023年11月02日 52 0

(文章目录)


前言

在前面的文章中我们的文件全部都是放在同一个目录下面的,那么在实际的工程开发中会这样做吗?答案肯定是不会的,因为将全部的文件放在同一个目录下会显得十分凌乱,这样不便于代码的管理。

一、常用的源码管理方式

我们通常将各个模块的源码分开管理,并且将模块中的.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的时候会起的非常大的作用,希望大家好好总结。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  lG7RE7vNF4mc   2023年11月13日   34   0   0 默认值html搜索
micz61TEX78l