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

  • 相关阅读:
    BZOJ3631: [JLOI2014]松鼠的新家
    网络流24题题目总会+题解
    BZOJ3930: [CQOI2015]选数
    BZOJ4816: [Sdoi2017]数字表格
    Launcher类源码分析
    平台特定的启动类加载器深入分析与自定义系统类加载器详解
    类加载器命名空间总结与扩展类加载器要点分析
    类加载器命名空间深度解析与实例分析
    类加载器实战剖析与疑难点解析
    类加载器命名空间实战剖析与透彻理解
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6774706.html
Copyright © 2020-2023  润新知