Makefile的特性介绍

  1. 变量
    在Makefile文件中,存在着大量的文件名,而且这些文件名都是重复出现的。所以在源文件比较多的情况下,很容易发生遗漏或写错文件名。而且一旦源文件的名称发生了变化,还容易造成与其他文件名不一致的错误。于是,Makefile提供了变量来代替文件名。变量的使用方式为:
    $(变量名)
    例如:
    obj = a.o b.o

test : $(obj)
cc -o test $(obj)
a.o : a.c b.h
cc -c a.c
b.o : b.c
cc -c b.c
该Makefile使用了变量obj来代替“a.o b.o”。当源文件名发生改动或增删源文件时,只要对变量obj的值进行相应的修改就可以了,这样可以避免文件名不一致或遗漏的错误。Makefile中变量的命名可以使用字符、数字和下划线,但要注意变量名对大小写是敏感的。
此外,Make工程管理器提供了灵活的变量定义方式,具体有以下几种实现方式。
(1)通过“=”来实现
例如:
a1= $(a2)
a2= $(a3)
a3= a.o
这种方式下变量a1的值是a.o,也就是说前面的变量可以通过后面的变量来定义。但使用这种方式定义变量时,要防止出现死循环的情况。
(2)通过“:=”来实现
例如:
a1:= a.o
a2:= $(a1) b.o
这种方式下变量a1的值是a.o,变量a2的值是a.o b.o。
例如:
a1:= $(a2) b.o
a2:= a.o
这种方式下变量a1的值是b.o,而不是“a.o b.o”。也就是说前面的变量不能通过后面的变量来定义。
(3)通过“+=”来实现
例如:
a1= a.o
a1+= b.o
这种方式下变量a1的值是“a.o b.o”。也就是说“+=”可以实现给变量追加值。等同于如下示例:
a1= a.o
a1:= $(a1) b.o
可以看到,Makefile的“+=”和C语言中的“+=”是非常相似的。
(4)通过“?=”来实现
例如:
a1:= a.o
a1?=b.o
这种方式下变量a1的值是a.o,而不是b.o。也就是说,如果变量a1已经在前面定义过了,那么后面的定义就无效了。
以上所介绍的变量都是全局变量,也就是在整个Makefile文件中都可以访问的。
2. 自动推导
为了进一步简化Makefile的书写,Make工程管理器提供了自动推导的功能。自动推导功能默认每个目标文件都有一个与之对应的依赖文件。比如a.o文件有依赖文件a.c与之对应)。这样在Makefile中就不需要指定与目标文件对应的依赖文件名了。此外,自动推导功能还能推导出与目标文件对应的基本编译规则命令。比如a.o文件的规则命令为“gcc –c –o a.c”。
例如:
obj = a.o b.o

test : $(obj)
cc -o test KaTeX parse error: Expected 'EOF', got '#' at position 43: …localhost home]#̲make cc –c –o a…进行标识,其使用格式为:
KaTeX parse error: Unexpected character: '' at position 60: …简单介绍一些常用的基本函数。 ̲subst 格式:(subset 参数1,参数2,参数3)
功能:把参数3中的参数1替换成参数2
返回值:被替换后的参数3
例如:
result := KaTeX parse error: Unexpected character: '' at position 69: …ve the world”。 ̲patsubst 格式:(patsubset模式参数,参数1,参数2)
功能:把参数2中符合模式参数的单词(单词是指参数中被空格隔开的字符串)替换成参数1
返回值:被替换后的参数2
例如:
result := KaTeX parse error: Unexpected character: '' at position 50: …t的值为“x.o y.o”。 ̲wildcard 格式:(wildcard模式参数)
功能:列出当前目录下所有符合模式参数的文件名
返回值:当前目录下所有符合模式参数的文件名
例如:
result := KaTeX parse error: Unexpected character: '' at position 39: …为当前目录下所有的C文件名。 ̲strip 参数 格式:(strip 参数)
功能:去掉参数中开头和结尾的空格
返回值:被去掉空格的参数
例如:
result := KaTeX parse error: Unexpected character: '' at position 39: …ult的值为“China”。 ̲findstring 格式:(findstring 参数1,参数2)
功能:在参数2中查找参数1
返回值:如果找到返回参数1,如果没找到返回空
例如:
result := $(findstring me, you and me)
result的值为“me”。
result := KaTeX parse error: Unexpected character: '' at position 43: …) result的值为“”。 ̲filter 格式:(filter模式参数,参数1)
功能:从参数1中筛选出符合模式参数的字符串
返回值:符合参数模式的字符串
例如:
a := x.c y.c z.h
result := $(filter %.c, KaTeX parse error: Unexpected character: '' at position 26: …t的值为“x.c y.c”。 ̲addsuffix 格式:(addsuffix 参数1,参数2)
功能:在参数2中的每个单词加上后缀参数1
返回值:加上后缀的所有单词
例如:
result := KaTeX parse error: Unexpected character: '' at position 41: …t的值为“x.c y.c”。 ̲addprefix 格式:(addprefix 参数1,参数2)
功能:在参数2中的每个单词加上前缀参数1
返回值:加上前缀的所有单词
例如:
result := KaTeX parse error: Unexpected character: '' at position 55: …/x.c src/y.c”。 ̲foreach 格式:(foreach 变量参数,参数1,表达式)
功能:循环取出参数1中的单词赋给变量参数,然后运行表达式
返回值:表达式的运行结果
例如:
a:= x y z
result := $(foreach b, $(a), KaTeX parse error: Unexpected character: '' at position 49: …,b在这里是一个临时的变量。 ̲call 格式:(call 变量参数,参数…)
功能:循环把参数依次赋给变量参数中的 ( 1 ) 、 (1)、 (1)(2)…
返回值:赋值后的变量值
例如:
a:= $(2) $(1)
result := $(call KaTeX parse error: Unexpected character: '' at position 26: …result的值为“yx”。 ̲if 格式:(if 条件参数,执行参数)
功能:如果条件参数非空,运行执行参数部分
返回值:条件参数非空,返回执行参数部分
例如:
result := ( i f C h i n a , w o r l d ) r e s u l t 的 值 为 “ w o r l d ” 。 格 式 : (if China, world) result的值为“world”。 格式: (ifChina,world)resultworld(if 条件参数,执行参数1,执行参数2)
功能:如果条件参数非空,运行执行参数1部分;反之运行执行参数2部分
返回值:条件参数非空,返回执行参数1;反之返回执行参数2
例如:
a:=
result := $(if KaTeX parse error: Unexpected character: '' at position 38: …ult的值为“world”。 ̲dir 格式:(dir 参数)
功能:从参数中取出目录部分
返回值:目录部分
例如:
result:=KaTeX parse error: Unexpected character: '' at position 46: …“/home/test/”。 ̲error 格式:(error 参数)
功能:停止“Make”运行并显示参数
返回值:参数
例如:
result:=KaTeX parse error: Unexpected character: '' at position 49: …rror occure!”。 ̲warning 格式:(warning 参数)
功能:“Make”运行时显示参数
返回值:参数
例如:
result:=$( warning warning occure!)
result的值为“warning occure!”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值