makefile 中的 VPATH与vpath区别

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
成功!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值