初学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