`
zzc1684
  • 浏览: 1222629 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Makefile 中:= ?= += =的区别

阅读更多

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

新建一个Makefile,内容为:

ifdef DEFINE_VRE
    VRE = “Hello World!”
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的值将会是 xyz bar ,而不是 foo bar 。

      2、“:=”

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

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

      在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。

分享到:
评论

相关推荐

    makefile 中赋值符号的区别

    下面将详细解释 `=`、`:=`、`?=` 和 `+=` 这四种赋值运算符的区别。 1. `=`(延迟赋值) 这个是最基础的赋值操作符。使用 `=` 进行赋值时,Makefile会进行延时展开(也称为懒惰展开或二次展开)。这意味着变量的值...

    des算法代码实现输出matlab-CodePracticeAndLibBuild:算法训练日志

    中:= ?= += =的区别 keil编译链接过程以及ARMCC、ARMASM、FROMELF、ARMLINK、ARMAR的使用   关于排序算法的总结 va_start和va_end使用详解 Keil中使用宏编译来定义DEBUG输出 typedef void (*func)(void *) 的含义 ...

    Makefile学习笔记.docx

    * `:=`只能引用已经定义之前的变量,防止递归。例如: ``` x := y y = 10 ``` 在上面的例子中,x的值将是undefined,因为y的值还没有被定义。 * `?=`如果这个变量之前没有定义的话,给该变量赋值,如果已经定义,则...

    shell脚本与Makefile区别.docx

    "shell脚本与Makefile区别" shell 脚本和 Makefile 是两个不同的工具,它们都用于自动化构建和编译过程,但是它们有很大的不同之处。本文将详细介绍 shell 脚本和 Makefile 的区别。 首先,shell 脚本和 Makefile ...

    GTK+ FAQ常见问题解答

    5.8 信号和事件有什么区别? 5.9 我的delete_event (或者是其他事件)操作函数得到了错误的参数。 5.10 我已经联结了事件处理函数,但是这个好像没有起作用,那个地方错了? 5.11 我怎么增加一个新的信号到一个GTK+ ...

    Makefile最适合入门的教程

    Makefile中还可以定义变量,使用“=”或“:=”操作符。其中,使用“=”定义的变量在之后可以被扩展,而使用“:=”定义的变量只能使用在此变量之前的定义值。 通过对Makefile的介绍,可以理解其在软件项目管理中的...

    免费:makefile编程

    - **包含其它 makefile 文件**:讲解如何在一个 makefile 文件中引入另一个 makefile 文件,以便于组织大型项目的构建脚本。 - **变量 MAKEFILES**:探讨如何通过 MAKEFILES 变量来控制 makefile 的加载顺序。 - **...

    makefile中文手册(200页pdf文档)

    - **变量**:允许在 Makefile 中定义和使用变量,类似于编程语言中的变量。 - **函数**:提供了一系列内置函数来处理字符串、路径等。 - **条件执行**:支持基于条件的逻辑分支。 ### 详细知识点解析 #### 1. ...

    GUN make中文手册(makefile编写参考手册)

    =`进行赋值,它们之间存在区别:`=`, `:=`是立即展开赋值,而`?=`是延迟展开赋值,只有在使用时才会计算变量的值。 变量的高级用法包括变量的递归扩展(`$$`用于在变量赋值时保留`$`的特殊含义)和条件表达式,如`...

    Android的底层库

    LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := main.c LOCAL_MODULE := test_exe include $(BUILD_EXECUTABLE) ``` - **静态库(归档文件)的Android.mk示例**: ```makefile ...

    Makefile经典教程_Makefile linux_makefile 编写

    在Linux开发环境中,Makefile是不可或缺的工具,它帮助开发者自动化构建、编译和链接程序,极大地提高了工作效率。本教程将深入讲解Makefile的核心概念、结构以及编写技巧,旨在让你快速掌握这一强大的工具。 首先...

    linux内核kbuild Makefile详解

    2. **kbuild架构**:kbuild由一系列的Makefile组成,包括顶级的`Makefile`、`Rules.make`、`Kbuild`等,以及每个子目录中的`Kconfig`和`Makefile`。`Kconfig`用于配置内核选项,而`Makefile`则定义了如何构建目标。 ...

    【推荐】GNU make中文手册

    3.4 变量MAKEFILES和MAKEFILE_LIST:讲解了这两个特殊变量的用途,它们在Makefile解析过程中的作用。 3.5 其他特殊变量:列出了其他重要的预定义变量,如$(CC)、$(CFLAGS)等,以及如何自定义它们。 3.6 makefile文件...

    makefile经典教程

    在Unix和类Unix系统中,如Linux,`make`是一个标准的命令工具,用来解析和执行Makefile中的指令。 ### 1. 什么是Makefile? Makefile是一个文本文件,包含了编译、链接等构建步骤的指令。它告诉`make`命令如何构建...

    通用Makefile及解释.pdf

    1. 变量赋值:“:=”与“=”的区别在于“:=”在进行赋值时,会立即展开变量,而“=”则是在使用时才展开变量。在Makefile中,由于变量的展开时机不同,会影响到变量赋值后的依赖关系和文件的生成。 2. 隐含规则:...

    linux下gcc,g++的用法和区别,以及makefile的编写

    ### Linux 下 GCC、G++ 的用法和区别,以及 Makefile 的编写 #### GCC 和 G++ 编译流程 在 Linux 系统中,GCC (GNU Compiler Collection) 是一个非常强大的工具集,它包含了多种编程语言的编译器,如 C、C++、...

    GCC和MakeFile入门代码一

    GCC和Makefile是软件开发中两个非常重要的工具。GCC(GNU Compiler Collection)是GNU项目的一部分,它是一个开源的编译器套件,用于将源代码编译为可执行程序。而Makefile则是一个自动化构建工具,它允许开发者通过...

    Makefile中文教程

    - **灵活的构建策略**:Makefile可以根据不同的构建需求调整构建策略,例如开发环境和生产环境的区别。 - **增强团队协作**:统一的构建规则有助于团队成员之间的协作,避免了因个人习惯差异导致的问题。 总之,...

Global site tag (gtag.js) - Google Analytics