makefile的=与:=的不同

本文深入解析Makefile中'='与'=='的用法,通过实例演示了延迟解析与立即解析的区别,解释了OBJS_2与OBJS_3输出结果的不同,帮助初学者更好地掌握Makefile的基础知识。

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

 初学makefile,仅记于此,以免后忘而不知所解。

makefile中的=,用专业一点的术语来说,就是延迟解析,而:=为立即解析。

请看下面例子:(摘自优快云论坛 http://topic.youkuaiyun.com/u/20090918/16/688cd38c-6f7b-4e22-aca2-938e72d2b1ad.html)

SRCS     = main.c foo.cpp
OBJS    := $(SRCS:.c=.o)
OBJS_2   = $(OBJS)
OBJS_3  := $(OBJS)
OBJS    := $(OBJS:.cpp=.o)

bar:    $(OBJS)
        $(CXX) $(CFLAGS) -o $@ $(OBJS) $(LDFLAGS) $(LDLIBS)

clean:
        rm -f bar $(OBJS)

haha:
        @echo OBJS_2=$(OBJS_2)
        @echo OBJS_3=$(OBJS_3)


输出:

OBJS_2=main.o foo.o
OBJS_3=main.o foo.cpp

也就是说,“=”为将整个makefile展开之后,再将最后的值赋给变量,对于OBJS_2来讲,就是如此。而“:=”是立即将值赋给变量,与变量所处的位置有关。OBJS第一次使用OBJS := $(SRCS:.c=.o)赋值后的值为main.o foo.cpp,然后将OBJS立即赋值给OBJS_3,即OBJS_3 := $(OBJS),而后面没有对OBJS_3进行修改,因此OBJS_3的输出为main.o foo.cpp。但是对于OBJS_2赋值为延迟解析,因此OBJS_2的值决定于最后对OBJS的修改的值,即OBJS := $(OBJS:.cpp=.o)修改OBJS的值为main.o foo.o,因此OBJS_2的输出为main.o foo.o

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值