makefile vpath和VPATH小结

一:先看VPATH吧。
我们看到跟我一起学makefile当中的这段话。
在这里插入图片描述
注意点有两点,
(1)make只会在当前的目录下去寻找依赖文件和目标文件。
(2)使用VPATH的方法,这点相对容易一些。

我们先看第一点是什么意思。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这是当前的目录结构。

makefile的第一版是这样写的。

#vpath %.c src
#vpath %.h inc

VPATH = src:inc

target : main.o g_a.o g_b.o
        gcc -o target main.o g_a.o g_b.o
main.o : main.c g_a.h g_b.h
        gcc -c main.c -o main.o
g_a.o : g_a.c g_a.h
        gcc -c g_a.c -o g_a.o
g_b.o : g_b.c g_b.h
        gcc -c g_b.c -o g_b.o

.PHONY : clean

clean :
        -rm target g_a.o g_b.o main.o

在这里插入图片描述
报错了,提示我们找不到文件在哪里,这就涉及到VPATH的理解了,上面说make只会在当前的目录下去寻找依赖文件和目标文件,以

main.o : main.c g_a.h g_b.h
        gcc -c main.c -o main.o

举例,有了VPATH这个变量,只是会让执行make命令时,找到依赖项的main.c g_a.h g_b.h文件而已,但是执行gcc命令时,他不知道main.c文件在那里。所以我们需要改一下。

makefile的第二版,使用自动变量

VPATH = src:inc

target : main.o g_a.o g_b.o
        gcc -o $@ $^
        @echo $@
        @echo $^
main.o : main.c g_a.h g_b.h
        gcc -o $@ -c $<
        @echo $@
        @echo $<
g_a.o : g_a.c g_a.h
        gcc -o $@ -c $<
        @echo $@
        @echo $<
g_b.o : g_b.c g_b.h
        gcc -o $@ -c $<

在这里插入图片描述
看输出情况,使用了自动变量以后,可以找到源文件在那里了,但是提示找不到相应的头文件,看来需要我们使用-I命令把头文件目录给加进去。

第三版:

   gcc -o $@ $^
        @echo $^
        @echo $@
main.o : main.c g_a.h g_b.h
        gcc -c $< -o $@ -I inc
        @echo $@
        @echo $<
g_a.o : g_a.c g_a.h
        gcc -c $< -o $@ -I inc
        @echo $@
        @echo $<
g_b.o : g_b.c g_b.h
        gcc -c $< -o $@ -I inc
        @echo $@
        @echo $<

.PHONY : clean

clean :
        -rm target g_a.o g_b.o main.o

最后顺利通过编译。

二:vpath(小写)
是makefile当中的一个关键字,用法的话,具有匹配模式。例如

vpath %.h ./headers

headers在搜索所有的头文件等等。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 1 make概述 1.1 怎样阅读本手册 1.2 问题和BUG 2 Makefile文件介绍 2.1 规则的格式 2.2一个简单的Makefile文件 2.3make处理Makefile文件的过程 2.4使用变量简化Makefile文件 2.5让make推断命令 2.6另一种风格的Makefile文件 2.7在目录中删除文件的规则 3 编写Makefile文件 3.1Makefile文件的内容 3.2Makefile文件的命名 3.3包含其它的Makefile文件 3.4变量MAKEFILES 3.5Makefile文件重新生成的过程 3.6重载其它Makefile文件 3.7make读取Makefile文件的过程 4 编写规则 4.1规则的语法 4.2在文件名中使用通配符 4.2.1通配符例子 4.2.2使用通配符的常见错误 4.2.3函数wildcard 4.3在目录中搜寻依赖 4.3.1VPATH:所有依赖的搜寻路径 4.3.2vpath指令 4.3.3目录搜寻过程 4.3.4编写搜寻目录的shell命令 4.3.5目录搜寻和隐含规则 4.3.6连接库的搜寻目录 4.4假想目标 4.5没有命令或依赖的规则 4.6使用空目录文件记录事件 4.7内建的特殊目标名 4.8具有多个目标的规则 4.9具有多条规则的目标 4.10静态格式规则 4.10.1静态格式规则的语法 4.10.2静态格式规则和隐含规则 4.11双冒号规则 4.12自动生成依赖 5 在规则中使用命令 5.1命令回显 5.2执行命令 5.3并行执行 5.4命令错误 5.5中断或关闭make 5.6递归调用make 5.6.1变量MAKE的工作方式 5.6.2与子make通讯的变量 5.6.3与子make通讯的选项 5.6.4`--print-directory'选项 5.7定义固定次序命令 5.8使用空命令 6 使用变量 6.1变量引用基础 6.2变量的两个特色 6.3变量高级引用技术 6.3.1替换引用 6.3.2嵌套变量引用 6.4变量取值 6.5设置变量 6.6为变量值追加文本 6.7override指令 6.8定义多行变量 6.9环境变量 6.10特定目标变量的值 6.11特定格式变量的值 7 Makefile文件的条件语句 7.1条件语句的例子 7.2条件语句的语法 7.3测试标志的条件语句 8 文本转换函数 8.1函数调用语法 8.2字符串替换和分析函数 8.3文件名函数 8.4函数foreach 8.5函数if 8.6函数call 8.7函数origin 8.8函数shell 8.9控制Make的函数 9 运行make 9.1指定Makefile文件的参数 9.2指定最终目标的参数 9.3代替执行命令 9.4避免重新编译文件 9.5变量重载 9.6测试编译程序 9.7选项概要 10 使用隐含规则 10.1使用隐含规则 10.2隐含规则目录 10.3隐含规则使用的变量 10.4隐含规则链 10.5定义与重新定义格式规则 10.5.1格式规则简介 10.5.2格式规则的例子 10.5.3自动变量 10.5.4格式匹配 10.5.5万用规则 10.5.6删除隐含规则 10.6定义最新类型的缺省规则 10.7过时的后缀规则 10.8隐含规则搜寻算法 11 使用make更新档案文件 11.1档案成员目标 11.2档案成员目标的隐含规则 11.2.1更新档案成员的符号索引表 11.3使用档案的危险 11.4档案文件的后缀规则 12 GNU make的特点 13 不兼容性和失去的特点 14 Makefile文件惯例 14.1makefile文件的通用惯例 14.2makefile文件的工具 14.3指定命令的变量 14.4安装路径变量 14.5用户标准目标 14.6安装命令分类 15快速参考 16make产生的错误 17复杂的Makefile文件例子 附录 名词翻译对照表

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值