android android.mk中:= ?= +=之间的区别

转自:http://blog.csdn.net/love_xsq/article/details/50395138

在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 了。

原文地址:https://www.cnblogs.com/dirt2/p/8550641.html

时间: 2024-10-28 20:27:49

android android.mk中:= ?= +=之间的区别的相关文章

android:id="@android:id/tabhost" 、android:id="@+id/llRoot" 、android:id="@id/llRoot" 之间的区别

由于快要放暑假了,所以最近这俩周把Android方面的知识复习一下,准备找个实习工作. 顺便把自己的总结更大家分享一下,共同进步,谢谢.... 一. android:id="@android:id/tabhost"   是调用系统内部的ID 和代码中 mTabContent = (FrameLayout) findViewById(com.android.internal.R.id.tabcontent); 是一回事. 二. android:id="@+id/llRoot&q

Android中几种资源之间的区别

在Android应用程序中包含assets文件夹.res文件夹以及res/raw文件夹这几个文件夹都用于存放我们应用程序的资源,那它们之间有什么区别呢? assets文件夹:用于存放需要打包到安装程序中的静态文件,存放在这里的资源都会原封不动的保存在安装包中,不会被编译成二进制.与res不同的是,assets支持任意深度的子目录(即在该文件夹下可以任意创建子文件夹).这些文件不会生成任何资源标记,必须使用/assets开始(但不包含它)的相对路径名,需要使用AssetManager类访问,通过文

android中getWidth()和getMeasuredWidth()之间的区别

先给出一个结论:getMeasuredWidth()获取的是view原始的大小,也就是这个view在XML文件中配置或者是代码中设置的大小.getWidth()获取的是这个view最终显示的大小,这个大小有可能等于原始的大小也有可能不等于原始大小. 从源码上开始分析一下这两个方法的区别.首先来看一下getMeasuredWidth()这个方法. 1 public final int getMeasuredWidth() { 2 return mMeasuredWidth & MEASURED_S

Android培训准备资料之UI一些相似控件和控件一些相似属性之间的区别

这一篇博客主要收集五大布局中的一些相似控件和控件一些相似属性之间的区别 ImageView ImageButton Button 三者有啥区别? (1)Button继承自TextView,ImageView继承自View,ImageButton继承自ImageView                                              (2)Button支持android:text属性,而ImageButton和ImageView不支持,但是ImageView和ImageB

Android.mk中的经常使用语法

Android.mk编译文件是用来向Android NDK描写叙述你的C,C++源码文件的, 今天查了一些经常使用的的语法. 一 概述: 一个Android.mk文件用来向编译系统描写叙述你的源码. 详细来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或很多其它次的build系统. 你能够在每个Android.mk文件里定义一个或多个模块, 你也能够在几个模块中使用同一个源码文件. 二 语法 1 必须定义内容 先看必须定义的内容: LOCAL_PATH := $(call

Android的ImageView中的android:src和android:background的区别

http://www.androidren.com/index.php?qa=301&qa_1=android的imageview中的android-src和android-background的区别 有下面几个不同点: 1.src是前景foreground.background是后景background. 2.src是显示内容,background是背景. 3.background是所有view都有的属性,而src是ImageView特有的,它会受到android:scaleType的影响,而

Android.mk中LOCAL_MODULE_CLASS对LOCAL_MODULE_PATH 的影响

LOCAL_MODULE_CLASS用于制定LOCAL_MODULE_PATH的路径所在. 如果在Android.mk没有直接明确LOCAL_MODULE_PATH 的话,需要通过以下规则来自动生成base_rules.mk: 154 LOCAL_MODULE_PATH := $(strip $(LOCAL_MODULE_PATH)) 155 ifeq ($(LOCAL_MODULE_PATH),) 156 #LOCAL_MODULE_CLASS := 157 LOCAL_MODULE_PATH

【转】Update: Android.mk 中的 LOCAL_SRC_FILES, LOCAL_C_INCLUDES

看原文请移步:Update: Android.mk 中的 LOCAL_SRC_FILES, LOCAL_C_INCLUDES 我在先前的两篇post 编写Android.mk中的LOCAL_SRC_FILES的终极技巧 编写 android.mk 中 LOCAL_C_INCLUDES 的技巧 中提到了一些编译android.mk文件的技巧, 由于都涉及到了shell命令, 导致不能完全在windows下工作, 下面我使用纯净的makefile语法重新编写了脚本 # 配置自己的源文件目录和源文件后

[转]编写 android.mk 中 LOCAL_C_INCLUDES 的技巧

看原文请移步:编写 android.mk 中 LOCAL_C_INCLUDES 的技巧 在编写android.mk的过程中,免不了要修改LOCAL_C_INCLUDES来设置头文件的include目录, 一般写成这样 LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes $(LOCAL_PATH)/../../Classes/game $(LOCAL_PATH)/../../Classes/logic $(LOCAL_PATH)/../../Classe