C语言的本质(38)——makefile之变量

本文详细探讨了Makefile中变量的语法规则,包括延迟展开、立即展开、追加赋值以及特殊变量的使用。通过实例展示了如何定义和使用变量,如CFLAGS和CPPFLAGS,以及如何利用+=运算符追加值。同时,文章还介绍了$@、$<、$?和$^等特殊变量的作用,并列举了一些常用的make隐含规则变量及其默认值。
摘要由CSDN通过智能技术生成

我们详细看看Makefile中关于变量的语法规则。先看一个简单的例子:

foo = $(bar)
bar = Huh?
 
all:
    @echo$(foo)


我们执行make将会打出Huh?。当make读到foo = $(bar)时,确定foo的值是$(bar),但并不立即展开$(bar),然后读到bar = Huh?,确定bar的值是Huh?,然后在执行规则all:的命令列表时才需要展开$(foo),得到$(bar),再展开$(bar),得到Huh?。因此,虽然bar的定义写在foo之后,$(foo)展开还是能够取到$(bar)的值。

这种特性有好处也有坏处。好处是我们可以把变量的值推迟到后面定义,例如:

main.o: main.c
    $(CC)$(CFLAGS) $(CPPFLAGS) -c $<
 
CC = gcc
CFLAGS = -O -g
CPPFLAGS = -Iinclude


编译命令可以展开成gcc -O -g -Iinclude -cmain.c。通常把CFLAGS定义成一些编译选项,例如-O、-g等,而把CPPFLAGS定义成一些预处理选项,例如-D、-I等。用=号定义变量的延迟展开特性也有坏处,就是有可能写出无穷递归的定义,例如CFLAGS = $(CFLAGS) -O,或者:

A = $(B)
B = $(A)


当然,make有能力检测出这样的错误而不会陷入死循环。有时候我们希望make在遇到变量定义时立即展开,可以用:=运算符,例如:

x := foo
y := $(x) bar
 
all:
    @echo"-$(y)-"


当make读到y :=$(x) bar定义时,立即把$(x)展开,使变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尹成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值