首页 > 代码库 > Android中makfile的随记
Android中makfile的随记
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的随记