在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 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 了。
相关推荐
下面将详细解释 `=`、`:=`、`?=` 和 `+=` 这四种赋值运算符的区别。 1. `=`(延迟赋值) 这个是最基础的赋值操作符。使用 `=` 进行赋值时,Makefile会进行延时展开(也称为懒惰展开或二次展开)。这意味着变量的值...
中:= ?= += =的区别 keil编译链接过程以及ARMCC、ARMASM、FROMELF、ARMLINK、ARMAR的使用 关于排序算法的总结 va_start和va_end使用详解 Keil中使用宏编译来定义DEBUG输出 typedef void (*func)(void *) 的含义 ...
* `:=`只能引用已经定义之前的变量,防止递归。例如: ``` x := y y = 10 ``` 在上面的例子中,x的值将是undefined,因为y的值还没有被定义。 * `?=`如果这个变量之前没有定义的话,给该变量赋值,如果已经定义,则...
"shell脚本与Makefile区别" shell 脚本和 Makefile 是两个不同的工具,它们都用于自动化构建和编译过程,但是它们有很大的不同之处。本文将详细介绍 shell 脚本和 Makefile 的区别。 首先,shell 脚本和 Makefile ...
5.8 信号和事件有什么区别? 5.9 我的delete_event (或者是其他事件)操作函数得到了错误的参数。 5.10 我已经联结了事件处理函数,但是这个好像没有起作用,那个地方错了? 5.11 我怎么增加一个新的信号到一个GTK+ ...
Makefile中还可以定义变量,使用“=”或“:=”操作符。其中,使用“=”定义的变量在之后可以被扩展,而使用“:=”定义的变量只能使用在此变量之前的定义值。 通过对Makefile的介绍,可以理解其在软件项目管理中的...
- **包含其它 makefile 文件**:讲解如何在一个 makefile 文件中引入另一个 makefile 文件,以便于组织大型项目的构建脚本。 - **变量 MAKEFILES**:探讨如何通过 MAKEFILES 变量来控制 makefile 的加载顺序。 - **...
- **变量**:允许在 Makefile 中定义和使用变量,类似于编程语言中的变量。 - **函数**:提供了一系列内置函数来处理字符串、路径等。 - **条件执行**:支持基于条件的逻辑分支。 ### 详细知识点解析 #### 1. ...
=`进行赋值,它们之间存在区别:`=`, `:=`是立即展开赋值,而`?=`是延迟展开赋值,只有在使用时才会计算变量的值。 变量的高级用法包括变量的递归扩展(`$$`用于在变量赋值时保留`$`的特殊含义)和条件表达式,如`...
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := main.c LOCAL_MODULE := test_exe include $(BUILD_EXECUTABLE) ``` - **静态库(归档文件)的Android.mk示例**: ```makefile ...
在Linux开发环境中,Makefile是不可或缺的工具,它帮助开发者自动化构建、编译和链接程序,极大地提高了工作效率。本教程将深入讲解Makefile的核心概念、结构以及编写技巧,旨在让你快速掌握这一强大的工具。 首先...
2. **kbuild架构**:kbuild由一系列的Makefile组成,包括顶级的`Makefile`、`Rules.make`、`Kbuild`等,以及每个子目录中的`Kconfig`和`Makefile`。`Kconfig`用于配置内核选项,而`Makefile`则定义了如何构建目标。 ...
3.4 变量MAKEFILES和MAKEFILE_LIST:讲解了这两个特殊变量的用途,它们在Makefile解析过程中的作用。 3.5 其他特殊变量:列出了其他重要的预定义变量,如$(CC)、$(CFLAGS)等,以及如何自定义它们。 3.6 makefile文件...
在Unix和类Unix系统中,如Linux,`make`是一个标准的命令工具,用来解析和执行Makefile中的指令。 ### 1. 什么是Makefile? Makefile是一个文本文件,包含了编译、链接等构建步骤的指令。它告诉`make`命令如何构建...
1. 变量赋值:“:=”与“=”的区别在于“:=”在进行赋值时,会立即展开变量,而“=”则是在使用时才展开变量。在Makefile中,由于变量的展开时机不同,会影响到变量赋值后的依赖关系和文件的生成。 2. 隐含规则:...
### Linux 下 GCC、G++ 的用法和区别,以及 Makefile 的编写 #### GCC 和 G++ 编译流程 在 Linux 系统中,GCC (GNU Compiler Collection) 是一个非常强大的工具集,它包含了多种编程语言的编译器,如 C、C++、...
GCC和Makefile是软件开发中两个非常重要的工具。GCC(GNU Compiler Collection)是GNU项目的一部分,它是一个开源的编译器套件,用于将源代码编译为可执行程序。而Makefile则是一个自动化构建工具,它允许开发者通过...
- **灵活的构建策略**:Makefile可以根据不同的构建需求调整构建策略,例如开发环境和生产环境的区别。 - **增强团队协作**:统一的构建规则有助于团队成员之间的协作,避免了因个人习惯差异导致的问题。 总之,...