对Makefile的浅显理解2
设置makefile中文件的搜索路径
在makefile中,可以通过给VPATH赋值来设置规则中目标文件和依赖文件的搜索目录。Make首先搜索当前目录,如果未找到依赖的文件,make将按照VPATH中给的目录依次搜索VPATH对makefile中所有文件都有效。
如:VPATH = src : …/headers
上面的的定义指定两个目录,“src”和“…/headers”,make 会按照这个顺序进行搜索。目录由“冒号”分隔。(当前目录是最高优先搜索的地方)
也可以使用指令vpath,与VPATH在使用上的区别是:vpath可以给不同类文件指定不同的搜索目录。如:
vpath %.c /src
vpath %.h …/headers
vpath %.c 表示清除所有vpath对%.c设置的搜索目录(后面不带路径)
定义变量和引用变量
变量的定义和应用与Linux环境变量一样,变量名要大写,变量一旦定义后,就可以通过将变量名用圆括号括起来,并在前面加上“$”符号来进行引用。
变量的主要作用:
1、保存文件名列表
2、保存可执行命令名,如编译器
3、保存编译器的参数
变量一般都在makefile的头部定义。按照惯例,所有的makefile变量都应该是大写。
GNU make的主要预定义变量
$* 不包括扩展名的目标文件名称
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$< 第一个依赖文件的名称
$? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚
$@ 目标的完整名称
$^ 所有的依赖文件,以空格分开,不包含重复的依赖文件
$% 如果目标是归档成员,则该变量表示目标的归档成员名称
3个常用的预定义变量
1. $@ 表示要生成的目标
2. $^ 表示全部的依赖文件
3. $< 表示第一个依赖文件
bin/cn_work : obj/main.o obj/cn_work.o obj/fun.o
gcc $^ -o $@ (命令一定要用以Tab开头)
obj/cn_work.o : sources/cn_work.c
gcc -I headers -c $< -o $@
obj/main.o : sources/main.c
gcc -I headers -c $< -o $@
obj/fun.o : sources/fun.c
gcc -I headers -c $< -o $@
clean:
rm -f bin/cn_work file_o/*.o
gcc 的3个参数:
- -o 指定目标文件
gcc sources/main.c -o bin/main - -c 编译的时候只生产目标文件不链接
gcc -c sources/main.c -o obj/main.o - -I 主要指定头文件的搜索路径
gcc -I headers -c main.c -o main.o