首页 > 代码库 > Android中makfile的随记

Android中makfile的随记

    什么是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的随记