VPATH:官方解释为一般搜索,大写的VPATH是make中一种特殊变量,这个变量指定了make中的依赖文件的路径,用空格或者冒号将多个路径隔开。
vpath:官方解释为选择性搜索,小写的vpath,这是make中的一个关键字,通俗来讲就是在指定路径中寻找指定类型的文件,vpath的用法要比VPATH更加灵活。用空格或者冒号将多个路径隔开,这个和VPATH一样。
下面看一个例子具体理解:
通常程序并不只存放在同一个目录下,例如:
├── include
│ ├── bar.h
│ └── foo.h
├── Makefile
└── src
├── bar.c
├── foo.c
└── main.c
代码如下
/* bar.h */
#ifndef __BAR_H
#define __BAR_H
extern void bar(void);
#endif /* __BAR_H */
/* foo.h */
#ifndef __FOO_H
#define __FOO_H
extern void foo(void);
#endif /* __FOO_H */
/* bar.c */
#include <stdio.h>
void bar(void)
{
printf("bar function\n");
}
/* foo.c */
#include <stdio.h>
void foo(void)
{
printf("foo function\n");
}
/* main.c */
#include <stdio.h>
#include "foo.h"
#include "bar.h"
int main(void)
{
printf("main function\n");
foo();
bar();
return 0;
}
编写makefile 如下:
CC = gcc
OBJ = main.o foo.o bar.o
prog:$(OBJ)
$(CC) -o $@ $(OBJ)
%.o:%.c
$(CC) -c $<
.PHONY:clean
clean:
rm -rf prog $(OBJ)
执行make后出现
[root@node1 Makefile]# make
make: *** 没有规则可以创建“prog”需要的目标“main.o”。 停止。
这是因为make找不到依赖文件,此时的main.c在src文件夹中。
修改Makefile,加上指定路径VPATH=src:include :
# Makefile
CC=gcc
OBJ=main.o foo.o bar.o
VPATH=src:include
prog:$(OBJ)
$(CC) -o $@ $(OBJ)
%.o:%.c
$(CC) -c $<
.PHONY:clean
clean:
-rm -f prog $(OBJ)
执行make后依然报错:
[root@node1 aa]# make
gcc -c src/main.c
src/main.c:4:17: 错误:foo.h:没有那个文件或目录
src/main.c:5:17: 错误:bar.h:没有那个文件或目录
make: *** [main.o] 错误 1
这次提示缺少foo.h与bar.h文件,为什么?上面VPATH已经指明了路径啊??
是因为VPATH只对make起作用,可以让make找到目标文件和依赖文件,但是不能让gcc找到。继续修改Makefile:
加上-I include
1 # Makefile
2 CC=gcc
3 OBJ=main.o foo.o bar.o
4 VPATH=src:include
5 CPPFLAGS=-I include
6 prog:$(OBJ)
7 $(CC) -o $@ $(OBJ)
8 %.o:%.c
9 $(CC) $(CPPFLAGS) -c $<
10 .PHONY:clean
11 clean:
12 -rm -f prog $(OBJ)
执行make :
[root@node1 aa]# make
gcc -I include -c src/main.c
gcc -I include -c src/foo.c
gcc -I include -c src/bar.c
gcc -o prog main.o foo.o bar.o
成功!
将VPATH改成vpath试试:
1 # Makefile
2 CC=gcc
3 OBJ=main.o foo.o bar.o
4 CPPFLAGS= -I include
5 #VPATH=src:include
6 vpath %.h include
7 vpath %.c src
8 prog:$(OBJ)
9 $(CC) -o $@ $(OBJ)
10 %.o:%.c
11 $(CC) $(CPPFLAGS) -c $<
12 .PHONY:clean
13 clean:
14 -rm -f prog $(OBJ)
执行make:
[root@node1 aa]# make
gcc -I include -c src/main.c
gcc -I include -c src/foo.c
gcc -I include -c src/bar.c
gcc -o prog main.o foo.o bar.o
成功!