什么是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. 十. 图形界面(GUI)设计5.布局设计

    在界面设计中,一个容器要放置许多组件,为了美观,为组件安排在容器中的位置,这就是布局设计.java.awt中定义了多种布局类,每种布局类对应一种布局的策略.常用的有以下布局类: FlowLayout, ...

  2. [OpenJudge8782][划分DP]乘积最大

    乘积最大 总时间限制: 1000ms 内存限制: 65536kB [描述] 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛, ...

  3. UWP 程序抛出异常时总是跳到“global::System.Diagnostics.Debugger.Break();”的解决办法

    调试 C# 程序时,如果遇到异常,VS 会中断,指出导致异常的语句.但是最近调试 UWP 程序时,发现总是在“global::System.Diagnostics.Debugger.Break();” ...

  4. JavaScript中的模块化之AMD和CMD

    前言: 为什么我们需要模块化开发,模块化开发的好处有哪些? 首先我们先说一下非模块化的开发方式带来的弊端. 非模块化开发中会导致一些问题的出现,变量和函数命名可能相同,会造成变量污染和冲突,并且出错时 ...

  5. 7zip File: How to Uncompress 7z files on Ubuntu, Debian, Fedora

    转:http://www.thegeekstuff.com/2010/04/7z-7zip-7za-file-compression/ Question: How do I uncompress a ...

  6. 【docker】查看docker容器或镜像的详细信息命令,查看docker中正在运行的容器的挂载位置

    命令: docker inspect f257d69e0035 格式: docker inspect 容积或镜像ID 首先,docker ps获取简要信息 然后输入命令docker inspect   ...

  7. Go测试,功能测试,性能测试,测试辅助,go test 工具,高级测试,IO相关测试,黑盒测试,HTTP测试,进程测试

    go命令教程: http://wiki.jikexueyuan.com/project/go-command-tutorial/0.5.html Go测试 第一个测试 “Hello Test!” 首先 ...

  8. MVC Movie App

    ylbtech- ASP.NET MVC:MVC Movie App 功能描述:MVC Movie App 2,TechnologyAndTheEnvironment(技术与环境) 操作系统: win ...

  9. C#文本之XML

    格式化XML public static string FormatXML(string XMLstring) { //校验是否是XML报文 if (!XMLstring.Contains(" ...

  10. mac打开所有软件源

    sudo spctl --master-disable