在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自动将其转化成了正确的路径及文件名。