您当前的位置:首页 > 计算机 > 编程开发 > 编译原理

Makefile中变量的高级用法:变量的替换引用、变量的嵌套使用

时间:03-26来源:作者:点击数:

高级使用方法有两种:第一种是变量的替换引用,第二种是变量的嵌套引用。

第一种用法经常用到,第二种用法我们很少使用。我们应该尽量避免使用变量的嵌套引用,在必须使用时,嵌套的层数越少越好。因为这种方法表达比较复杂,条理难以理清。

变量的替换引用:

我们使用变量的时候,经常对它的值(字符串)进行操作。

操作字符串,通常使用字符串操作函数,比如 patsubst 函数(模式字符串替换函数),但是使用变量同样可以实现类似 patsubst 函数的功能。

我们通过下面的例子来具体分析。

写法一:

foo:=a.c b.c d.c
obj:=$(foo:.c=.o)
All:
    @echo $(obj)

这段代码实现的功能是字符串的后缀名的替换,把变量 foo 中所有的以 .c 结尾的字符串全部替换成 .o 结尾的字符串。在 shell 命令行执行 make 命令,打印出来的是 "a.o b.o d.o" ,实现了文件名后缀的替换。

注意,括号中的变量,使用的是变量名而不是变量名的引用,变量名与参数选项之间用冒号隔开,表达式中间不能使用空格。

写法二:

foo:=a.c b.c d.c
obj:=$(foo:%.c=%.o)
All:
    @echo $(obj)

在 shell 中执行 make 命令,发现结果和写法一是相同的。这里的表达式中使用了通配符 "%",表示自动匹配一个或多个字符。在开发的过程中,我们通常会使用这种方式来进行变量替换引用的操作。

写法二比写法一更加实用。因为在实际使用的过程中,我们对某个变量值的修改,可能不只是它的一部分,也可能是它的多个部分,那么第一种方式就不能实现了。比如:

foo:=a123c a1234c a12345c
obj:=$(foo:a%c=x%y)
All:
    @echo $(obj)

这个例子中我们操作的是两个不连续的部分,执行 make 后打印的值是 "x123y x1234y x12345y",这种情况下我们使用第一种情况就不能实现,所以第二种的使用更全面。

变量的嵌套使用:

我们对一个变量进行赋值时可以引用其他的变量,并且引用变量的数量和和次数是不限制的。

下面我们通过几个实例来说明一下。

实例 1:

foo:=test
var:=$(foo)
All:
    @echo $(var)

这种用法是最常见的使用方法,打印出 var 的值就是 test。我们可以认为是一层的嵌套引用。

实例 2:

foo=bar
bar=test
var:=$($(foo))
All:
    @echo $(var)

执行 make 命令的时候得到的结果也是 test。$(foo) 代表的字符串是 bar,变量 bar 表示的值是 test,所以对 bar 的引用就是 test,所以最终 var 的值就是 test。这是变量的二层嵌套执行。当然我们还可以使用三层的嵌套执行,写法跟上面的方式是一样的。嵌套的层数也可以更多,但是不提倡使用。

我们在给一个变量进行赋值时,可以同时引用多个变量,还可以包含一些文本字符。比如:

first_pass=hello
bar=first
var:=$(bar)_pass
all:
    @echo $(var)

或者

first_pass=hello
bar=first
foo=pass
var:=$(bar)_$(foo)
all:
    @echo $(var)

执行 make 时, var 的值是 hello。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门