MakeFIle 变量定义及引用 $@,$^,$<

来源:互联网 发布:上海黑马程序员地址 编辑:程序博客网 时间:2024/05/18 03:22

MakeFile中给变量赋值有以下两种方式:

1.递归展开式,使用=直接定义,例子如下:

               foo = $(bar)
               bar = $(ugh)
               ugh = Huh?
               all:;echo $(foo)
  执行“make”将会打印出“Huh?”。整个变量的替换过程时这样的:首先“$(foo)”被替换为“$(bar)”,接下来 “$(bar)”被替换为“$(ugh)”,最后“$(ugh)”被替换为“Hug?”。整个替换的过程是在执行“echo $(foo)”是进行的。

  这种方式的缺点是

           缺点1:使用此风格的变量定义,可能会由于出现变量递归定义而导致make陷入到无限的变量展开过程中,最终使make执行失败.
           缺点2:这种风格的变量定义中如果使用了函数,那么包含在变量值中的函数总会在变量被引用的地方执行(变量被展开时)。

2.直接展开式

这种风格的变量使用“:=”来定义变量。在使用“:=”定义变量时,变量值中对另外变量的引用或者函数的引用在定义时被展开(对变量进行替换)。


x := foo
y := $(x) bar
x := later
就等价于:
y := foo bar
x := later
需要CFLAGS := $(include_dirs) -O
include_dirs := -Ifoo -Ibar
由于在变量“include_dirs”的定义出现在“CFLAGS”定义之后。因此在“CFLAGS”的定义中,“include_dirs”的值为空。“CFLAGS”的值为“-O”而不是“-Ifoo -Ibar -O”。注意的是:此风格变量在定义时就完成了对所引用的变量的展开,因此它不能实现对其后定义变量的引用。

 变量的替换引用,格式为“$(VAR:A=B)”(或者“${VAR:A=B}”),
 意思是,替换变量“VAR”中所有“A”字符结尾的字为“B”结尾的字。
 “结尾”的含义是空格之前(变量值多个字之间使用空格分开)。
 而对于变量其它部分的“A”字符不进行替换。


关于Makefile中的$@,$^,$<一直有些疑问。今天记录一下相关内容,以备以后查阅。

$@,$^,$<这些是makefile中的自动变量。针对一条目标和依赖关系的命令来说。

$@  表示目标文件
$^  表示所有的依赖文件
$<  表示第一个依赖文件

比如我们一个目录下有以下文件:main.c hello.c 两个文件。我们要写makefile。

一般的不用自动变量的方法:

hello: main.o hello.o

gcc -o hello main.o hello.o

main.o: main.c

gcc -c main.c

hello.o: hello.c

gcc -c hello.c

.PHONY : clean
clean:
rm -rf  *.o hello

以上内容描述了要生成最终目标所需要的文件及依赖关系还有生成目标文件的命令。

比如这样一条目标、依赖条目:

hello: main.o hello.o

make程序默认:$@ 表示hello   $^表示main.o hello.o     $< 表示main.o

将上面的makefile更改为使用自动变量的形式,我们就不用在命令里重写这些依赖文件了。更改后如下:

hello: main.o hello.o

gcc -o$@ $^

main.o: main.c

gcc -c$^

hello.o: hello.c

gcc -c $^

.PHONY : clean
clean:
rm -rf  *.o hello

显得更简洁一些。

下面附上学习makefile的一个资料内容:

跟我一起写makefile




0 0