什么是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. 条件运算符的结合方向是自右至左。

最新文章

  1. 自学MVC看这里——全网最全ASP.NET MVC 教程汇总
  2. 【跟着子迟品 underscore】Array Functions 相关源码拾遗 & 小结
  3. python 字节与字符串转换
  4. Unity3d 鼠标拣选小功能集合
  5. 【转】移动端viewport的使用
  6. 最严谨的校验email地址的正则表达式
  7. A06_RelativeLayout的属性设置
  8. activity工作的使用
  9. UUID为36位
  10. pureMVC简单示例及其原理讲解五(Facade)
  11. sql-update语句多表级联更新
  12. jmeter导入DB数据再再优化
  13. MySQL数据库入门(建库和建表)--陈远波
  14. Goland 提示 :configuration is still incorrect 的解决
  15. 【设计模式】单例模式 Singleton Pattern
  16. Spring AOP前置通知实例说明AOP相关概念
  17. [转载]你所不了解的DevOps
  18. Python: Ubuntu 安装numpy,scipy,matplotlib
  19. Cannot determine embedded database driver class for database type NONE
  20. 4609: [Wf2016]Branch Assignment 最短路 DP (阅读理解题)

热门文章

  1. 6.2(java学习笔记)字节流
  2. Java高级架构师(一)第18节:X-gen所需service、web层模板
  3. 触摸事件onTouchListener
  4. iOS开发技巧——Autolayout动画
  5. 线程协作-Semaphore并发限制
  6. GIS空间参考及坐标转换
  7. 客户端JavaScript加密数据,服务端Java解密数据
  8. pomise的简单用法
  9. nodeJs+socket.io
  10. [Linux] ubuntu 格式化u盘