在我们为一个具体任务编写程序时,通常都以项目树的形式来组织源代码的布局,而不会仅有一个源程序,对于这种情况,Make 程序就必须到很多个目录中去搜寻依赖目标,如何完成这一任务呢?GNU Make程序给了我们两个非常有用的变量:VPATH 和 vpath。通过这两个变量,可以帮助我们写出有效的 makefile 文件,来完成多个目录的 make 工作。
假设我们有一个工程,项目树布局如下所示:
calc/
|-- makefile
|-- include/
| `-- calc.h
`-- src/
|-- add.c
`-- main.c
它完成的任务很简单,在主程序里调用运算函数完成指定的算术运算,例如四则运算等(为简化说明,示例工程中只包含加法运算)。因此,我们可以写出如下的 makefile:
CC = gcc
CPPFLAGS = -I./include
VPATH = src include
calc: main.o add.o
$(CC) -o $@ $^
$(RM) $^
main.o: main.c calc.h
add.o: add.c
在shell中运行make,可以看到如下输出结果:
gcc -o calc src/main.o src/add.o
rm -f src/main.o src/add.o
可见,通过给 VPATH 变量赋值,make 程序会自动到 VPATH 变量中指定的目录下搜寻依赖目标,而不用我们手动去指定了。VPATH 变量的内容就是目录列表,通过空格或冒号分隔(windows上是空格或分号,所以最好用空格)。但是 VPATH 变量有一个缺点,就是搜索一个依赖目标时,make 会遍历 VPATH 中的每个目录,如果有同名文件话就很容易出现问题,解决的方法是使用 vpath 变量,它可以指定到哪个目录下搜索哪类目标,语法如下:
vpath 模式 目录列表
例如,我们可以把上面的 makefile 改成
vpath %.c src
vpath %.h include
这样,make 程序就知道,应该到 src 目录下搜索 .c 文件,到 include 目录下搜索 .h 文件。
要强调的一点是,通过 VPATH 和 vpath 变量,我们可以完成源代码放在多个目录下的 make 工作,但是对于更大的工程,只是通过 VPATH 和 vpath 是不够的,autoconf 和 automake 才是更好的选择。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lijiangshui/archive/2007/01/26/1495199.aspx