嵌入式 Makefile中:=与?=与+=与=的区别$@,$^,$<区别

原创 2013年12月02日 14:50:58

在Makefile中我们经常看到 = := ?= +=这几个赋值运算符,那么他们有什么区别呢?我们来做个简单的实验

新建一个Makefile,内容为:
ifdef DEFINE_VRE
    VRE = “HelloWorld!”
else
endif

ifeq ($(OPT),define)
    VRE ?=“Hello World! First!”
endif

ifeq ($(OPT),add)
    VRE +=“Kelly!”
endif

ifeq ($(OPT),recover)
    VRE :=“Hello World! Again!”
endif

all:
    @echo$(VRE)

敲入以下make命令:
make DEFINE_VRE=true OPT=define 输出:Hello World!
make DEFINE_VRE=true OPT=add 输出:Hello World! Kelly!
make DEFINE_VRE=true OPT=recover  输出:Hello World!Again!
make DEFINE_VRE= OPT=define 输出:Hello World!First!
make DEFINE_VRE= OPT=add 输出:Kelly!
make DEFINE_VRE= OPT=recover 输出:Hello World! Again!

从上面的结果中我们可以清楚的看到他们的区别了
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值

 

之前一直纠结makefile中“=”和“:=”的区别到底有什么区别,因为给变量赋值时,两个符号都在使用。网上搜了一下,有人给出了解答,但是本人愚钝,看不懂什么意思。几寻无果之下,也就放下了。今天看一篇博客,无意中发现作者对于这个问题做了很好的解答。解决问题之余不免感叹,有时候给个例子不就清楚了吗?为什么非要说得那么学术呢。^_^

     1、“=”

     make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:

            x= foo
           y = $(x) bar
           x = xyz

      在上例中,y的值将会是 xyzbar ,而不是 foobar 

     2、“:=”

     “:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。

            x:= foo
           y := $(x) bar
           x := xyz

     在上例中,y的值将会是 foobar ,而不是 xyzbar 了。

 

Makefile有三个非常有用的变量。分别是$@,$^,$<代表的意义分别是:

$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件

如果我们使用上面三个变量,那么我们可以简化我们的Makefile文件为:

# 这是简化后的Makefile

main:main.o mytool1.o mytool2.o

gcc -o $@ $^

main.o:main.c mytool1.h mytool2.h

gcc -c $<

mytool1.o:mytool1.c mytool1.h

gcc -c $<

mytool2.o:mytool2.c mytool2.h

gcc -c $<

经过简化后我们的Makefile是简单了一点,不过人们有时候还想简单一点。这里我们学习一个Makefile的缺省规则

.c.o:

gcc -c $<

这个规则表示所有的 .o文件都是依赖与相应的.c文件的。例如mytool.o依赖于mytool.c这样Makefile还可以变为:

# 这是再一次简化后的Makefile

main:main.o mytool1.o mytool2.o

gcc -o $@ $^

.c.o:

gcc -c $<

 

相关文章推荐

单片机及嵌入式 的应用区别

  • 2010年09月03日 20:52
  • 3.24MB
  • 下载

嵌入式做驱动,做系统,以及做应用,分工有什么区别。

一、嵌入式硬件开发:熟悉电路等知识,非常熟悉各种常用元器件,掌握模拟电路和数字电路设计的开发能力。熟练掌握嵌入式硬件知识,熟悉硬件开发模式和设计模式,熟悉ARM32位处理器嵌入式硬件平台开发、并具备产...

单片机和嵌入式设计的区别

单片机和嵌入式,其实没有什么标准的定义来区分他们,对于进行过单片机和嵌入式开发的开发者来说,都有他们自己的定义,接下来,就谈谈本人对这两个概念的理解和感悟。 首先明确概念,什么是单片机,单片机是一种...

【智能家居篇】嵌入式WIFI与普通WIFI的区别

既然我们这系列的文章名称为《智能家居篇》,那么我们有必要提出一个与智能家居相关的概念。曾经一次在TI的无线研讨会上,提及这个概念。究竟是TI提出的,还是其他无线厂家提出的,这个就不去深究了。这个概念就...

嵌入式 软中断与硬中断的区别精华

①硬中断是由外部事件引起的因此具有随机性和突发性;软中断是执行中断指令产生的,无面外部施加中断请求信号,因此中断的发生不是随机的而是由程序安排好的。 ②硬中断的中断响应周期,CPU需要发中断回合信号...
  • skdkjxy
  • skdkjxy
  • 2013年12月02日 14:42
  • 593

ARM,单片机,FPGA,嵌入式这些有什么区别

单片机的特点: (1)受集成度限制,片内存储器容量较小,一般内ROM:8KB以下;(2)内RAM:256KB以内。(3)可靠性高(4)易扩展(5)控制功能强(6)易于开发 ARM的特点: ...

嵌入式项目1--PECO2与PaCO2的区别与联系

一、目前进展,几个常见的问题及解决 Q1:怎么评估慢阻肺疾病恶化?(参考GOLD–2016) 1、动脉血气测量,PaO2(动脉血氧压力)6.7Kpa(50mmHg),即可认为存在呼吸衰...

嵌入式WIFI与普通WIFI的区别

既然我们这系列的文章名称为《智能家居篇》,那么我们有必要提出一个与智能家居相关的概念。曾经一次在TI的无线研讨会上,提及这个概念。究竟是TI提出的,还是其他无线厂家提出的,这个就不去深究了。这个概念就...

嵌入式数据库与数据库服务器的区别

初次接触嵌入式数据库(Embedded Database)可能对这个概念总不是很清楚,它究竟与数据库服务器(Database Server)有什么区别,它们又分别适用于那些应用场景呢,这是需要解决的问...

嵌入式编程与PC编程有何区别

能从PC机器编程去看嵌入式问题,那是第一步;学会用嵌入式编程思想,那是第二步;用PC的思想和嵌入式的思想结合在一起,应用于实际的项目,那是第三步。 有些朋友是从PC编程转向嵌入式编程...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式 Makefile中:=与?=与+=与=的区别$@,$^,$<区别
举报原因:
原因补充:

(最多只允许输入30个字)