Makefile 学习笔记(三)--- Makefile 使用变量

本文详细介绍了Makefile中的变量使用,包括基础用法、递归定义、?=:操作符、变量替换、追加变量值、override指示符、多行变量定义以及目标和模式变量的设定,旨在帮助读者掌握Makefile中的高级变量技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(以下内容为“陈皓 跟我一起写Makefile(pdf重制版)”整理复制)

 

  • 变量的基础

             变量在声明时需要给予初值,而在使用时,需要给在变量名前加上 $ 符号,但最好用小括号 () 或 是大括号 {} 把变量给包括起来。如果你要使用真实的 $ 字符,那么你需要用 $$ 来表示。

  • 变量中的变量

  1.   简单的使用 = 号,在 = 左侧是变量,右侧是变量的值,右侧变量的值可以 定义在文件的任何一处,也就是说,右侧中的变量不一定非要是已定义好的值,其也可以使用后面定义的值。       但是如果是递归定义:A = $(A) -o 就会让make 陷入无限的变量展开过程中。
  2.  :=操作符也可以。前面的变量不能使用后面的变量,只能使用前面已定义好了的变量。 
    x := foo
    y := $(x) bar
    x := later
    
    等价
    
    y := foo bar
    x := later

      3. ?=操作符含义是:(FOO ?=bar)  如果 FOO 没有被定义过,那么变量 FOO 的值就是“bar”,如果 FOO 先前被定义过, 那么这条语将什么也不做。

  • 变量高级用法

        1.变量值的替换

                意思是把变量“var”中所有以‘a’字串结尾的替换成‘b'字串

eg1:  $(var:a=b) 或 ${var:a=b}
eg2:  foo := a.o b.o c.o
      bar :=$(foo:.o=.c)

               还可以“静态模式”定义:这依赖于被替换字串中的有相同的模式,模式中必须包含一个 % 字符,这个例子同样让 $(bar) 变 量的值为“a.c b.c c.c”。

foo := a.o b.o c.o
bar := $(foo:%.o=%.c)

             2.把变量的值再当成变量

eg1 :   x = $(y)
        y = z
        z = Hello
        a := $($(x))
eg2 :   first_second = Hello
        a = first
        b = second
        all = $($a_$b)    
  • 追加变量值

             使用 += 操作符给变量追加值  :

             $(objects) 值变成:“main.o foo.o bar.o utils.o another.o”(another.o 被追加进去了)

objects = main.o foo.o bar.o utils.o
objects += another.o
  • override指示符

       如果有变量是通常 make 的命令行参数设置的,那么 Makefile 中对这个变量的赋值会被忽略。如果 你想在 Makefile 中设置这类参数的值,那么,你可以使用“override”指示符。

override <variable>; = <value>;
override <variable>; := <value>;
override <variable>; += <more text>;
  • 多行变量

        使用 define 关键字设置变量的值可以有换行,这有利于定义一系列的命令。define 指示符后面跟的是变量的名字,而重起一行定义变量的值,定义是以 endef 关键字结束。

  • 目标变量

        在这个示例中,不管全局的 $(CFLAGS) 的值是什么,在 prog 目标,以及其所引发的所有规则中 (prog.o foo.o bar.o 的规则),$(CFLAGS) 的值都是 -g

prog : CFLAGS = -g
prog : prog.o foo.o bar.o
    $(CC) $(CFLAGS) prog.o foo.o bar.o
prog.o : prog.c
    $(CC) $(CFLAGS) prog.c
foo.o : foo.c
    $(CC) $(CFLAGS) foo.c
bar.o : bar.c
    $(CC) $(CFLAGS) bar.c
  • 模式变量

        在 GNU 的 make 中,还支持模式变量。模式变量的好处就是,我们可以给定一种“模式”,可以把变量定义在符合这种模式的所有目标上。 我们知道,make 的“模式”一般是至少含有一个 % 的,所以,我们可以以如下方式给所有以 .o 结 尾的目标定义目标变量:

%.o : CFLAGS = -O

        同样,模式变量的语法和“目标变量”一样:

<pattern ...>; : <variable-assignment>;
<pattern ...>; : override <variable-assignment>;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值