目录
- 问题
在实际的工程项目中,所有的源文件和头文件都放在同一文件夹中吗?
1.常用的源码管理方式
2.下面的makefile能够成功编译吗?
3.特殊的预定义变量VPATH(全大写)
- VPATH变量的值用于指示make如何查找文件
- 不同文件夹可作为VPATH的值同时出现
- 文件夹的名字之间需要使用分隔符进行区分
改进:
我们指定了inc为什么还不行呢?
4.make对于VPATH值的处理方式
- 当前文件夹找不到需要的文件时,VPATH会被使用
- make会在VPATH指定的文件夹中依次搜索文件
- 当前多个文件夹存在同名文件时,选择第一次搜索到的文件
注意事项
VPATH只能决定make的搜索路径,无法决定命令的搜索路径
对于特定的编译命令(gcc),需要独立指定编译搜索路径
src/main.c
#include <stdio.h>
#include "func.h"
int main()
{
foo();
return 0;
}
src/func.c
#include <stdio.h>
#include "func.h"
void foo()
{
printf("void foo() : %s\n", HELLO);
}
inc/func.h
#ifndef FUNC_H
#define FUNC_H
#define HELLO "Hello D.T."
void foo();
#endif
makefile
OBJS := func.o main.o
INC := inc
SRC := src
VPATH := $(INC) $(SRC)
CFLAGS := -I $(INC)
hello.out : $(OBJS)
@gcc -o $@ $^
@echo "Target File ==> $@"
$(OBJS) : %.o : %.c func.h
@gcc $(CFLAGS) -o $@ -c $<
5.VPATH存在的问题
当inc文件夹中意外出现源文件(C/Cpp文件),那么可能产生编译错误!
在inc添加一个fun.c
6.替换方案:vpath关键字(全小写)
- 为不同类型的文件指定不同的搜索路径
- 语法:
在Directory中搜索符合Pattern的规则的文件
OBJS := func.o main.o
INC := inc
SRC := src
CFLAGS := -I $(INC)
vpath %.h $(INC)
vpath %.c $(SRC)
hello.out : $(OBJS)
@gcc -o $@ $^
@echo "Target File ==> $@"
# vpath %.h
$(OBJS) : %.o : %.c func.h
@gcc $(CFLAGS) -o $@ -c $<
7.取消搜索规则
- 取消已经设置的某个搜索规则
vpath Pattern
例:
- 取消所有已经设置的规则
vpath
8.小结
- VPATH变量用于指示make如何查找文件
- make会在VPATH指定的文件夹中依次搜索文件
- vpath关键字可以为不同类型的文件指定不同的搜索路径
- vpath比VPATH更灵活,可动态设置/取消搜搜路径