Makefile中的vpath理解--提示找不到文件

在makefile中,利用vpath和VPATH可以指定makefile中文件的目录。说说我在学习过程中遇到的问题吧。直接贴图把:

headers
makefile
sources

这是我当前目录的三个文件夹,分别存放头文件、makefile、源文件。

第一种问题:

=====Makefile=====

vpath %.h ../headers
vpath %.c ../sources
obj = good.o hello.o test1.o
test1: $(obj)
gcc -o test1 $(obj)
test1.o:test1.c hello.h good.h
gcc -c test1.c
good.o:good.c good.h
gcc -c good.c
hello.o: hello.c hello.h
gcc -c hello.c
.PHONY: clean
clean:
-rm test1.o good.o hello.o

=====报错=====

gcc -c good.c
gcc: 错误: good.c:没有那个文件或目录
gcc: 致命错误: 没有输入文件

=====理解=====

在gcc中直接用了good.c,make在分析依赖文件利用了vpath提供的路径,但是对于gcc直接使用good.c,是无法识别并找到的。因此提示没有那个文件。


第二种问题:

=====Makefile=====

vpath %.h ../headers
vpath %.c ../sources
obj = good.o hello.o test1.o
test1: $(obj)
gcc -o test1 $(obj)
test1.o:hello.h good.h
good.o:good.h
hello.o: hello.h
.PHONY: clean
clean:
-rm test1.o good.o hello.o

=====报错=====

cc    -c -o good.o ../sources/good.c
../sources/good.c:2:18: 致命错误: good.h:没有那个文件或目录

=====理解=====

这次是通过make自动推导依赖关系,自动找到文件路径,并自动生成cc命令。可以看到执行的命令中包含了good.c正确的路径,因此不在提示找不到good.c的文件了。但是这次却提示找不到good.h文件。因为我在good.c中include了good.h文件,但是对于自动生成的cc命令中并没有加入这个依赖关系,因此提示出错。


第三次不是问题,终于正确啦!

=====Makefile=====

vpath %.h ../headers
vpath %.c ../sources
obj = good.o hello.o test1.o
test1: $(obj)
gcc -o test1 $(obj)
test1.o:test1.c hello.h good.h
gcc -c $< -I ../headers
good.o:good.c good.h
gcc -c $< -I ../headers
hello.o:hello.c hello.h
gcc -c $< -I ../headers
.PHONY: clean
clean:
-rm test1.o good.o hello.o

=====正确=====

gcc -c ../sources/good.c -I ../headers
gcc -c ../sources/hello.c -I ../headers
gcc -c ../sources/test1.c -I ../headers
gcc -o test1 good.o hello.o test1.o

=====理解=====

对于找不到的.h文件,利用gcc命令的-I来说明。这样就可以正确执行来。对于命令中的$<,是一种自动变量(自己还是没弄太懂),但是可以发现make自动将其转化成了正确的路径及文件名。


总结:

可见make只是执行makefile里的命令而已,因此要确保命令书写时的正确性,可以直接把命令单独拿出来看是否能够执行,就可以判断这个命令是否正确了。当然为了方便可以利用make的自动推导,但是要彻底理解了中间的推导关系才能更好的灵活使用。

当然,第三种情况还是很烦琐的,有时间再研究研究,继续弄得彻底点。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值