Makefile VPATH和vpath

通常程序并不只存放在同一个目录下,例如:
├── include
│   ├── bar.h
│   └── foo.h
├── Makefile
└── src
    ├── bar.c
    ├── foo.c
    └── main.c
代码分别如下:

[cpp]  view plain  copy
  1. /* bar.h */  
  2. #ifndef __BAR_H  
  3. #define __BAR_H  
  4.   
  5. extern void bar(void);  
  6. #endif /* __BAR_H */  

[cpp]  view plain  copy
  1. /* foo.h */  
  2. #ifndef __FOO_H  
  3. #define __FOO_H  
  4.   
  5. extern void foo(void);  
  6. #endif /* __FOO_H */  

[cpp]  view plain  copy
  1. /* bar.c */  
  2. #include <stdio.h>  
  3.   
  4. void bar(void)  
  5. {  
  6.     printf("bar function\n");  
  7. }  

[cpp]  view plain  copy
  1. /* foo.c */  
  2. #include <stdio.h>  
  3.   
  4. void foo(void)  
  5. {  
  6.     printf("foo function\n");  
  7. }  

[cpp]  view plain  copy
  1. /* main.c */  
  2. #include <stdio.h>  
  3.   
  4. #include "foo.h"  
  5. #include "bar.h"  
  6.   
  7. int main(void)  
  8. {  
  9.     printf("main function\n");  
  10.   
  11.     foo();  
  12.     bar();  
  13.   
  14.     return 0;  
  15. }  

顶层Makefile如下:

[plain]  view plain  copy
  1. # Makefile  
  2. CC      = gcc  
  3. OBJ     = main.o foo.o bar.o  
  4.   
  5. prog:$(OBJ)  
  6.     $(CC) -o $@ $(OBJ)  
  7.   
  8. %.o:%.c  
  9.     $(CC) -c $<  
  10.   
  11.   
  12. .PHONY:clean  
  13. clean:  
  14.     -rm -f prog $(OBJ)  

如果仍然使用上面的Makefile,make时是不会通过的,因为main.c这些源文件已经移动到src目录中去了,默认情况下,make时只会在当前目录下寻找目标和依赖,也就是寻找main.o main.c这类文件,当前目录没有这些文件,肯定不能生成最终的目标文件prog,那么如何在其它目录下搜索目标和依赖呢?在Makefile中可以使用VPATH或者vpath,例如:

[plain]  view plain  copy
  1. # Makefile  
  2. CC      = gcc  
  3. OBJ     = main.o foo.o bar.o  
  4.   
  5.   
  6. VPATH   = src:include  
  7.   
  8. prog:$(OBJ)  
  9.     $(CC) -o $@ $(OBJ)  
  10.   
  11. %.o:%.c  
  12.     $(CC) -c $<  
  13.   
  14. main.o:foo.h bar.h  
  15.   
  16.   
  17. .PHONY:clean  
  18. clean:  
  19.     -rm -f prog $(OBJ)  

再次make,还是会提示缺少foo.h文件,那是因为VAPTH只对make起作用,以便make找到目标和依赖,不会对编译起任何作用。而gcc在编译main.c时由于没有找到foo.h这类头文件,所以会出现编译错误,这个时候就需要加上-I选项,修改后的Makefile如下:
[plain]  view plain  copy
  1. # Makefile  
  2. CC      = gcc  
  3. OBJ     = main.o foo.o bar.o  
  4.   
  5. CFLAGS  = -I include  
  6.   
  7. VPATH   = src:include  
  8.   
  9. prog:$(OBJ)  
  10.     $(CC) -o $@ $(OBJ)  
  11.   
  12. %.o:%.c  
  13.     $(CC) $(CFLAGS) -c $<  
  14.   
  15. main.o:foo.h bar.h  
  16.   
  17.   
  18. .PHONY:clean  
  19. clean:  
  20.     -rm -f prog $(OBJ)  

再运行make,最终得到prog程序。除了VPATH外,还可以使用vpath,用法如下:
1. vpath pattern directories


2. vpath pattern


3. vpath
第一个用法用于指定搜索目录,后两个用法用于清除搜索目录,例如:

[plain]  view plain  copy
  1. # Makefile  
  2. CC      = gcc  
  3. OBJ     = main.o foo.o bar.o  
  4.   
  5. CPPFLAGS= -Iinclude  
  6.   
  7. #VPATH  = src:include  
  8. vpath %.h include  
  9. vpath %.c src  
  10.   
  11. prog:$(OBJ)  
  12.     $(CC) -o $@ $(OBJ)  
  13.   
  14. %.o:%.c  
  15.     $(CC) $(CPPFLAGS) -c $<  
  16.   
  17. main.o:foo.h bar.h  
  18.   
  19.   
  20. .PHONY:clean  
  21. clean:  
  22.     -rm -f prog $(OBJ)  

注:将CFLAGS改为CPPFLAGS,因为-I选项应该是预编译中的选项,而不是编译选项。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值