makefile使用变量

1、makefile 变量的命令可以包含字符、数字、下划线(可以是数字开头),并且大小写敏感

2、makefile 变量在声明的是需要对其进行赋值,而在使用该变量时需要在变量名前加上$符合 例如$(VARNAME),如果用户需要在makefile文件中使用真实的$字符,则使用$$表示。

objects = main.o kdb.o
edit : $(objects)
gcc -o edit $(objects)
用户将编译器及编译选项定义为变量,这样做增强了makefile文件的灵活性。
例:
CC = gcc
FLAGS = -c
objects = main.o kdb.o \
          insert.o
edit :$(objects)
     $(CC) -o edit $(objects)
main.o : main.c defs.h
     $(CC) $(FLAGS) main.c
3、变量中的变量
   a、使用“=”操作符
     例:
foo = $(bar)
bar = $(ugh)
ugh = Huh?
all:
    echo $(foo) #输出变量foo
执行makefile
结果:
$make -s all
Hus?

     b、使用“:=”
使用“:=”操作符定义变量的值可以避免前述递归的危险。使用其定义变量时,前面的变量不能使用后面的变量,只能使用前面已定义好的变量。如果使用前面未定义的变量,则变量的值为空。

例:

y := $(x) bar
x := foo
all:
    echo $(y) #输出变量y
.PHONY:all
执行$make -s all
bar
输出的值是变量y的值,由于在定义y值的时候x变量尚未定义,所以其值为空。

     c、使用“?=”操作符

该操作符的含义是没如果变量之前没有被定义过,那么变量的值就被定义。如果变量的值之前已经被定义过了,这赋值语句什么也不做。
例:

a := hello
b ?= world
a ?= HELLO
all:
    echo $(a)
    echo $(b)
.PHPONY:all
执行
$make -s all
hello
world
由于a变量在“a?=HELLO”之前已经被定义,所以a变量的值没有被改变。b变量在“b?=world”之前没有定义,所以变量b值被定义为world。

4、追加变量的值
makefile 文件允许给一个变量追加一个值,其操作为“+=”

例1:

objects = main.o foo.o bar.o
objects += another.o
上述代码等价以下形式
objects = main.o foo.o bar.o
objects = $(objects) another.o

例2:

objects := main.o foo.o bar.o
objects += another.o
上述代码等价以下形式
objects := main.o foo.o bar.o
objects := $(objects) another.o

5、自动化变量
$@ 表示规则中的目标文件集
$% 仅当目标是函数库文件时表示规则中的目标成员。例如,如果一个目标是foo.a(bar.o)那么,$%就是bar.o, $@就是foo.a。如果目标不是函数文件,其值为空
$< 依赖列表中的第一依赖的名字
$? 所有比目标新的依赖的集合, 以空格分隔
$^ 所有依赖的集合,以空格分隔。如果在依赖中有多个重复的,那么这个变量会去除重复的依赖,只保留一份。
$+ 这个变量很像$^,也是所有依赖的集合,只是它不去除重复的依赖
$* 这个变量表示目标模式中 “%”及其之前的部分

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值