一:先看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在搜索所有的头文件等等。