Makefile中的变量讲解

在makefile中的定义的变量,就像是C/C++语言中的宏一样,他代表了一个文本字串,在Makefile中执行的时候其会自动原模原样地展开在所使用的地方。其与C/C++所不同的是,你可以在Makefile中改变其值 

变量在声明时需要给予初值,而在使用时,需要给在变量名前 加上“$”符号,但最好用小括号“()”或是大括号“{}”把变量给包括起来如果你要使用真实的“$”字符,那么你需要用“$$”来表示。变量可以使用在许多地方,如规则中的“目标”、“依赖”、“命令”以及新的变量中

变量的命名字可以包含字符、数字,下划线(可以是数字开头),但不应该含有“:”、“#”、“=”或是空字符(空格、回车等)。变量是区分英文字母大小写的。

更多单片机/嵌入式内容与参考资料:大叔的嵌入式小站:Makefile学习-2.变量讲解

一、创建和使用变量

变量定义的两种方式

1.递归展开方式 VAR=var

2.简单方式 VAR: =var

一般使用递归展开方式进行变量定义,递归的意思是后面对变量的修改会影响到前面。

变量的使用

示例1:

dir :=/foo/bar 
FOO?=bar

以上代码的含义是:如果FOO没有定义过,那么变量FOO的值就是‘bar’,如果FOO之前被定义过,那么什么也不做。

示例2:

#为变量添加值:可以通过+=为己定义的变量添加新的值 
Main=hello.o hello-1.o 
Main+=hello-2.o

二、变量的类型

1. 预定义变量

预定义变量其实就是系统内已经定义好的变量,变量名已经确定了,直接使用的话,使用的是默认值,你也可以重新赋值。下面列出一些常见的:

变量名            含义
CC            C编译器的名称,默认值为cc,即默认使用gcc编译器
RM            文件删除程序的名称,默认值为rm -f
CFLAGS        C编译器(gcc)的选项,无默认值,如-Wall、-g、-o
AR            库文件维护程序的名称,默认值为ar
CPP           C预编译器的名称,默认值为$(CC) –E
CPPFLAGS      C预编译的选项,无默认值
CXXFLAGS      C++编译器(g++)的选项,无默认值

2.自动变量

变量名        变量含义 
- $*        不包含扩展名的目标文件名称 
- $+        所有的依赖文件,以空格分开,并以出现后的先后为序,可能包含重复依赖文件 
- $<        第一个依赖文件的名称 
- $?        所有时间戳比目标文件晚的依赖文件,并以空格分开目标文件的完整名称 
- $@        目标文件的完整名称 
- $^        所有不重复的目标依赖文件,以空格分开 
- $%        如果目标是归档成员,则该变量表示目标的归档成员的目标名称

3.变量中的空格

下面再介绍两个定义变量时我们需要知道的,请先看一个例子,如果我们要定义一个变量,其值是一个空格,那么我们可以这样来:

nullstring := 
space := $(nullstring) # end of the line

nullstring 是一个Empty变量,其中什么也没有,而我们的space的值是一个空格。因为在操作符的右边是很难描述一个空格的,这里采用的技术很管用,先用一个 Empty变量来标明变量的值开始了,而后面采用“#”注释符来表示变量定义的终止,这样,我们可以定义出其值是一个空格的变量。请注意这里关于“#”的使用,注释符“#”的这种特性值得我们注意,如果我们这样定义一个变量:

dir := /foo/bar # directory to put the frobs in

dir这个变量的值是“/foo/bar”,后面还跟了个空格,如果我们这样使用这样变量来指定别的目录——“$(dir)/file”那么就完蛋了。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

闪耀大叔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值