Makefile中变量的定义及使用

Makefile中变量的定义及使用

CC := gcc
TAGRET := hello.out

$(TARGET): func.o main.o
    $(CC) -o $(TARGET) func.O  

上述Makefile中第一二行依次定义了变量CC、TARGET,第四五行引用了这两个变量,引用变量采用"$(变量名)"或者"${变量名}"的形式。

Makefile中的变量只能是字符串类型。
Makefile中变量有四种赋值方式:
1,简单赋值( := ) 编程语言中常规理解的赋值方式,只对当前语句的变量有效
2,递归赋值( = )赋值语句可能影响多个变量,所有目标变量相关的其他变量都受影响
3,条件赋值( ?= )如果变量未定义,则使用符号中的值定义变量。如果该变量已经赋值,则该赋值语句无效。
4,追加赋值( += )原变量用空格隔开的方式追加一个新值

用例子来了解一下各个赋值的差别:

简单赋值

x := foo
y := $(x)b
x := new

.PHONY : test
test:
    @echo "y => $(y)"
    @echo "x => $(x)"
输出值:
x => new
y => foob

递归赋值
x = foo
y = $(x)b
x = new

.PHONY : test
test:
    @echo "y => $(y)"
    @echo "x => $(x)"
输出值:
y = > newb
x => new

条件赋值
x := foo
y := $(x)b
x ?= new

.PHONY : test
test:
    @echo "y => $(y)"
    @echo "x => $(x)"
输出值:
y => foob
x = foo

追加赋值
x := foo
y := $(x)b
x += $(y)

.PHONY : test
test:
    @echo "y => $(y)"
    @echo "x => $(x)"
输出结果:
y => foob
x => foo foob


递归赋值就是一个连锁反应,只要之前与该变量直接产生过关联的变量都会有影响。

条件赋值,第一次为变量赋值的时候推荐条件赋值。





猜你喜欢

转载自blog.csdn.net/naughfy/article/details/80150312