什么是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. HTML5 boilerplate 笔记(转)

    最近在研究HTML5 boilerplate的模版,以此为线索可以有条理地学习一些前端的best practice,好过在W3C的文档汪洋里大海捞针……啊哈哈哈…… 开头的IE探测与no-js类是什么 ...

  2. 在xcode6中使用矢量图(iPhone6置配UI)

    转载出处:http://blog.xoneday.com ios应用程序是一个图像主导的产品.在开发一个应用程序时,你需要各种尺寸的图标,你需要为每个图像文件制作一个@1x尺寸和一个@2x尺寸.这样你 ...

  3. UITextField 如何设置为密码方式显示?

    UITextField 怎么设置成为一个 *号密码框 呢? 可以在 Interface Builder 里面直接设置吗? Attributes inspector 中 Text Field 下选中 S ...

  4. ASP.NET Core 1.0基础之诊断

    来源https://docs.asp.net/en/latest/fundamentals/diagnostics.html ASP.NET Core 1.0包含了一些新的特性来辅助诊断问题.可以在S ...

  5. 大数据的开始:安装hadoop

    为实现全栈,从今天开始研究Hadoop,个人体会是成为某方面的专家需要从三个方面着手 系统化的知识(需要看书或者比较系统的培训) 碎片化的知识(需要根据关注点具体的深入的了解) 经验的积累(需要遇到问 ...

  6. FL2440 rt3070模块station模式动态获取IP地址

    ---------------------------------------------------------------------------------------------------- ...

  7. Kubernetes用户指南(一)--快速开始、使用k8s配置文件

    一.快速开始 1.启动一个简单的容器. 一旦在container中打包好应用并将其commit为image之后,你就可以将其部署在k8s集群上. 一个简单的nginx服务器例子: 先决条件:你需要拥有 ...

  8. Java8 读写锁的改进:StampedLock(笔记)

         StampedLock是Java8引入的一种新的所机制,简单的理解,可以认为它是读写锁的一个改进版本,读写锁虽然分离了读和写的功能,使得读与读之间可以完全并发,但是读和写之间依然是冲突的,读 ...

  9. 【Java】Java_09 类型转换

    1.自动类型转换 自动类型转换:容量小的数据类型可以自动转换为容量大的数据类型.在图中,黑色的实线表示无数据丢失的自动类型转换,而红色的虚线表示在转换时可能会精度的损失. 特例: 可以将整型常量直接赋 ...

  10. Python爬取豆瓣《复仇者联盟3》评论并生成乖萌的格鲁特

    代码地址如下:http://www.demodashi.com/demo/13257.html 1. 需求说明 本项目基于Python爬虫,爬取豆瓣电影上关于复仇者联盟3的所有影评,并保存至本地文件. ...