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
- MakeFIle 变量定义及引用 $@,$^,$<
- MakeFile中的变量定义
- Makefile变量定义解析
- MakeFile中的变量定义
- makefile变量的定义
- makefile中变量的定义
- Makefile 变量定义(*赋值)
- Makefile 目标后定义变量
- Makefile中变量的定义
- Makefile知识点-3------makefile定义“空格”变量的定义方法
- loadrunner自己定义变量并且引用变量
- Linux之Makefile(变量的引用)
- 在makefile中递归引用变量
- makefile的变量定义和赋值
- Makefile文件变量的定义规则
- makefile中变量定义的空格
- makefile 分析 -- 内置变量及自动变量
- Makefile --- 1 输出Makefile中定义的变量的值
- [OpenGL]OpenGL坐标系及坐标转换
- strtol() -- 将字符串转换成长整型数(转载)
- 通过非安装Zip文件安装MySQL
- NSJSONSerialization-JSON数据与NSDictionary和NSArray之间的转化
- Andriod XML Editor cannot process this input
- MakeFIle 变量定义及引用 $@,$^,$<
- 个人对宝马2系的认知
- 网秦移动查找广告平台将建成全球文娱推广体系
- MySql密码问题
- 北大 POJ 1002
- ios--笔记--浏览相册选择图片(或视频)
- python数据结构与算法 36 树的基本概念
- Android中trim()函数的故事
- 野村证券:住房供应过剩 中国房地产泡沫已破裂