c语言sscanf函数的用法是什么
266
2022-09-18
makefile变量
如果需要用 $ 字符,那么需要用 $$ 来表示。 变量可以使用在规则中的“目标”、“依赖”、“命令”中及新的变量中。如:
CC = gccOBJS = program.o foo.o utils.oprogram : $(OBJS) $(CC) -o program $(OBJS)$(OBJS) : defs.h
注:强烈建议在引用变量时,加下小括号或大括号,这样可以更安全地引用变量。
变量会在引用它的地方展开,如:
foo = cprog.o : prog.$(foo) $(foo)$(foo) -$(foo) prog.$(foo)
展开后得到:
prog.o : prog.c cc -c prog.c
上面这个例子的用法,在实际生产,强烈不建议这么使用。
在 Makefile 中有两种方式来在用变量定义变量的值:
使用 = 号,右侧变量的值可以定义在文件的任何一处,即不需要定义在引用变量处之前,执行make时,会在引用的地方展开。
CC = gcc
使用 := 号
CC := gcc
第一种=号方式,因为引用它时,不用先定义(即可先引用后定义,或者反过来),这将导致递归定义,如:
CFLAGS = $(include_dirs) -oinclude_dirs = -Ifoo -IbarCFLAGS = $(CFLAGS) -o
CFLAGS = $(CFLAGS) -o在命令中被展开时会形成递归定义,这会让 make 陷入无限的变量展开过程中去。虽然,make有能力检测出这样的定义,并会报错。如果在变量中使用函数的话,这种递归让make 运行得非常慢,甚至可能发生不可预知的错误。
使用:= 操作符可以解决这个问题。而且使用这个操作符的话,前面的变量不能使用后面的变量,只能使用前面已定义好了的变量。 如:
x := fooy := $(x)
等价于:
y := foo barx := later
特别强调,如果是这样:
y := $(x)
那么,y 的值是“bar”,而不是“foo bar”。
?=操作符
FOO ?= bar
含义:如果 FOO 没有被定义过,那么将“bar”赋给它。如果 FOO 先前被定义过,那么这条语将什么也不做。上面这条语句等价于:
ifeq ($(origin FOO), undefined)
变量高级用法
第一种是变量值的替换可以替换变量中的公共部分,格式:$(var:a=b) 或 ${var:a=b} ,表示把变量“var”中所有以“a”结尾的“a”替换成“b”,如:
foo := a.o b.o c.obar := $(foo:.o=.c)
这个例子中,定义了变量foo。$(foo:.o=.c)就是把 $(foo) 中所有以 .o结 尾的.o全部替换成 .c ,所以$(bar) 的值是“a.c b.c c.c”。 另外一种变量替换的技术是以“静态模式”定义的,如:
foo := a.o b.o c.obar := $(foo:%.o=%.c)
这依赖于被替换字符串中的有相同的模式,%是一个通配符,而且静态模式中必须包含一个 % 字符,这个例子同样让 $(bar) 变量的值变为“a.c b.c c.c”。
- 第二种是“把变量的值再当成变量”
x = yy = za := $($(x))
在这个例子中,$(x) 的值是“y”,所以 $($(x)) 就是 $(y),于是 $(a) 的值就是“z”。还可以使用更多的层次,如:
x = yy = zz = ua := $($($(x)))
这里的 $(a) 的值是“u”。
+= 操作符给变量追加值 如:
objects = main.o foo.o bar.o utils.oobjects += another.o
$(objects) 值变成:“main.o foo.o bar.o utils.o another.o”
使用 += 操作符也可以写成下面的样子:
objects = main.o foo.o bar.o utils.oobjects := $(objects) another.o
如果变量之前没有定义过,那么,+= 会自动变成 = ,如果前面有变量定义,那么 += 会继承于前 次操作的赋值符。如果前一次的是 := ,那么 += 会以 := 作为其赋值符,如:
variable := valuevariable +=
等价于:
variable := valuevariable := $(variable)
但如果是:
variable = valuevariable +=
由于前次的赋值符是 = ,所以 += 也会以 = 来做为赋值,那么就会发生变量的递归定义,很不好,幸好 make 会自动解决这个问题。
多行变量 使用 define 关键字设置变量值的方法。使用 define 关键字设置变量的值可以有换行,有利于定义一系列的命令。define 指示符后面跟的是变量的名字,然后重起一行定义变量的值,定义是以 endef 关键字结束。其工作方式和“=”操作符一样。变量的值可以包含函数、命令、文字,或是其它变量。因为命令需要以[Tab] 键开头,所以如果你用 define 定义的命令变量中没有以 Tab 键开头,那么 make 就不会把其认为是命令。 下面的这个示例展示了 define 的用法:
define two-linesecho fooecho $(bar)
谢谢阅读
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~