什么是makefile?也许非常多Winodws的程序员都不知道这个东西,由于那些Windows的IDE都为你做了这个工作,但我认为要作一个好的Android底层程序员。

makefile还是要懂。

特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个側面说明了一个人是否具备完毕大型project的能力。

由于,makefile关系到了整个project的编译规则。一个project中的源文件不计数,其按类型、功能、模块分别放在若干个文件夹中。

makefile定义了一系列的规则来指定,哪些文件须要先编译,哪些文件须要后编译,哪些文件须要又一次编译,甚至于进行更复杂的功能操作。

由于makefile就像一个Shell脚本一样。当中也能够运行操作系统的命令。makefile带来的优点就是——“自己主动化编译”。一旦写好,

仅仅须要一个make命令,整个project全然自己主动编译,极大的提高了软件开发的效率。

Makefile基本教程。參考文档:http://blog.csdn.net/ruglcc/article/details/7814546

   因为各种编译须要,你须要做的最主要的就是看懂Makefile。最主要的就是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 了。

參考文档:http://www.cnblogs.com/wanqieddy/archive/2011/09/21/2184257.html

TIPS:

另外在C语言中三目运算中:

    假设在条件语句中,仅仅执行单个的赋值语句时, 常可使用条件表达式来实现。

不但使程序简洁,也提高了执行效率。

条件运算符为?和:,它是一个三目运算符。即有三个參与运算的量。

由条件运算符组成条件表达式的一般形式为:

   表达式1?

表达式2: 表达式3 

其求值规则为:假设表达式1的值为真,则以表达式2 的值作为条件表达式的值,否则以表达式2的值作为整个条件表达式的值。

条件表达式通经常使用于赋值语句之中。

比如条件语句: 

if(a>b) max=a;

         else max=b;

可用条件表达式写为 max=(a>b)?a:b; 运行该语句的语义是:如a>b为真,则把a赋予max,否则把b 赋予max。

使用条件表达式时,还应注意下面几点:

1. 条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。

因此 max=(a>b)?

a:b能够去掉括号而写为 max=a>b?

a:b

2. 条件运算符?

和:是一对运算符,不能分开单独使用。

3. 条件运算符的结合方向是自右至左。

Android中makfile的随记的更多相关文章

  1. 简单地Android中图片的三级缓存机制

    我们不能每次加载图片的时候都让用户从网络上下载,这样不仅浪费流量又会影响用户体验,所以Android中引入了图片的缓存这一操作机制. 原理: 首先根据图片的网络地址在网络上下载图片,将图片先缓存到内存 ...

  2. 关于Android中传递数据的一些讨论--备用

    在Android中编写过程序的开发人员都知道.在Activity.Service等组件之间传递数据(尤其是复杂类型的数据)很不方便.一般可以使用Intent来传递可序列化或简单类型的数据.看下面的代码 ...

  3. Xamarin Android 中Acitvity如何传递数据

    在xamarin android的开发中,activity传递数据非常常见,下面我也来记一下在android中activity之间传递数据的几种方式, Xamarin Android中Activity ...

  4. Android项目开发填坑记-Fragment的onBackPressed

    Github版 CSDN版 知识背景 Fragment在当前的Android开发中,有两种引用方式,一个是 Android 3.0 时加入的,一个是supportV4包中的.这里简称为Fragment ...

  5. Android项目开发填坑记-Fragment的onAttach

    背景 现在Android开发多使用一个Activity管理多个Fragment进行开发,不免需要两者相互传递数据,一般是给Fragment添加回调接口,让Activity继承并实现. 回调接口一般都写 ...

  6. Android项目开发填坑记-so文件引发的攻坚战

    故事的最初 我负责的项目A要求有播放在线视频的功能,当时从别人的聊天记录的一瞥中发现百度有相关的SDK,当时找到的是Baidu-T5Player-SDK-Android-1.4s,项目中Demo的so ...

  7. Android 系统(64)---Android中m、mm、mmm、mma、mmma的区别【转】

    本文转载自:https://blog.csdn.net/zhangbijun1230/article/details/80196379 Android中m.mm.mmm.mma.mmma的区别   m ...

  8. 关于Android中传递数据的一些讨论

    在Android中编写过程序的开发人员都知道.在Activity.Service等组件之间传递数据(尤其是复杂类型的数据)很不方便.一般可以使用Intent来传递可序列化或简单类型的数据.看下面的代码 ...

  9. Android中各级目录的作用

    Android中各级目录的作用 一.目录结构  src目录---存放源代码文件   gen目录---ADT插件生成的文件,(自动生成) R.java文件  drawable类---给图片生产的ID  ...

随机推荐

  1. [Eclipse]--Error:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path.

    一段时间没用eclipse后,再去打开以前的项目,发现一打开前线标红.查看错误的时候,如下图所示: Error:The superclass "javax.servlet.http.Http ...

  2. Hadoop下大矩阵乘法Version2

    1)使用本方法计算F*B,其中F是1000*1000的矩阵,B是1000*20000的矩阵,使用三个节点的集群,每个节点一个CPU核(集群装在虚拟机里,宿主机只有4个CPU核),每个节点配置一个map ...

  3. angualrjs2教程

    1.一本本开源的Angular2书籍:https://zhangchen915.gitbooks.io/angular2-training/ 2.好的博客教程,讲的通俗易懂:http://codin. ...

  4. 2016年31款轻量高效的开源 JavaScript 插件和库

    目前有很多网站设计师和开发者喜欢使用由JavaScript开发的插件和库,但同时面临一个苦恼的问题:它们中的大多数实在是太累赘而且常常降低网站的性能.其实,其中也有不少轻量级的插件和库,它们不仅轻巧有 ...

  5. ArcMap绘图时,节点显示时的小数点位数

    直接来图吧,省的啰嗦了: 打开选中节点的,节点坐标列表(Edit Sketch Properties):

  6. 正则表达式之 /^(\d)$/

    ^(\d)$就是0-9的任意一个数字, ^表示以...开头,\d表示0-9的数字,$表示以...结尾,

  7. 定期访问WebLogic Server返回状态的脚本

    在运维过程中,经常要获悉WebLogic Server的状态以便于主动的维护,本文通过weblogic WLST脚本初步设计了一下 脚本大概为2个,一是WLST的py脚本,getStates.py c ...

  8. 用Thunderbird以HTML发邮件,收件人却总是收到文本邮件

    要在通讯录里面,把你要发送的人设置可以接收HTML格式的邮件,那么你才能发出HTML格式. 否则,Thunderbird默认你所发的收件人无法接收HTML格式邮件.

  9. pgmagick,pil不保存图片并且获取图片二进制数据记录

    PIL和pgmagick都是python中图像处理的库,只不过PIL功能更强大 pgmagick和PIL中对数据进行调整后经常需要调用write或者save方法保存图片,然后在读取图片的内容,这样很麻 ...

  10. 【web】Ubuntu上安装nodejs 4.x 5.x版本方法

    在Linux(ubuntu server)上面安装NodeJS的正确姿势 上一篇文章,我介绍了 在Windows中安装NodeJS的正确姿势,这一篇,我们继续来看一下在Linux上面安装和配置Node ...