zoukankan      html  css  js  c++  java
  • makefile的10个关键知识点

    linux程序开发会使用GNU Make来构建和管理整个工程,Makefile 文件描述了整个工程的编译、连接等规则,执行make命令就是实现自动化编译链接的过程。

    一、编译链接

     

    编译: 将源文件(.c/.s)生成目标文件(.o)
    链接: 将目标文件和其依赖的静态库生成可执行文件

    二、makefile常用语法要点
    1. 规则语法
    target ...: prerequisites ...
    command
    ...   
    >target:
    目标,多种形式:目标文件、可执行文件、标签。
    >prereiquisites:
    target依赖的文件或目标
    >command:
    命令
    2. 运行过程
    1)make寻找当前目录下的Makefile文件。
    2)寻找文件内的第一个target。
    3)如果target不存在或者target的依赖文件比target更新,则将执行target后定义的command。
    4)在执行target后定义的command前,同样需要检查target依赖的文件是否存在以及该文件的依赖文件是否更新。
    make会一层层的寻找依赖性,直到最后生成target。
    3. 伪目标:
    >定义:
    “伪目标”并不是一个文件,只是一个标签,由于“伪目标”不是文件,所以make无法生成它的依赖关系和决定它是否要执行。我们只有通过显示地指明这个“目标”才能让其生效。
    >标记
    为了避免和文件重名的这种情况,我们可以使用一个特殊的标记“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”
    >典型伪目标
    all、clean
    4. 变量:
    >变量命名
    包含字符、数字,下划线(可以是数字开头),但不应该含有“:”、“#”、“=”或是空字符(空格、回车等)。变量是大小写敏感。
    >定义变量
    objects = a.o b.o
    >使用变量
     $(objects )、 $ objects 、${objects }
    >追加变量
     objects  += c.o
    5. 条件判断:ifeq
    示例
    ifeq ($(ENDIAN),EL)
    OFORMAT = -EL
    else
    OFORMAT = -EB
    endif
    6. 使用函数:
    >函数调用方法
    $(<function> <arguments>)
    <function>是函数名。<arguments>是函数的参数,参数间以逗号“,”分隔,而函数名和参数之间以“空格”分隔。
    例如:$(findstring bcd,abcdef)
    7. 引用文件:
    >引用方法
    include filename
    >示例
    include $(SDKINC)/sdk.xn
    8. 隐含规则:
    >定义模式规则
    使用模式规则来定义一个隐含规则。一个模式规则就好像一个一般的规则,只是在规则中,目标的定义需要有“%”字符。“%”的意思是表示一个或多个任意字符。在依赖目标中同样可以使用“%”,只是依赖目标中的“%”的取值,取决于其目标。
    >示例
    $(OBJ_C) : %.o : %.c
    $(CC) $(CC_OPTS) -c $< -o $@
    $(OBJ_S) : %.o : %.S
    $(CC) $(CC_OPTS_A) -c $< -o $@
    >自动化变量
    $<:依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。
    $@:目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。
    9. 注释方式:
    Makefile中只有行注释,其注释是用“#”字符
    注意:Makefile中的命令必须以TAB键开始
    10.Make运行:
    >指定Makefile
    Make默认会在当前目录下寻找Makefile/makefile。
    也可以自定义Makefile名字,例如:Makefile_ko。
    使用时需指定文件名make –f Mkaefile_ko
    >指定target
    make all、make test
    >Make的参数
    -C:进子目录编译,例如:Make –C ./cfg




    http://www.cnblogs.com/yueqian-scut/ 微信公众号:嵌入式企鹅圈
  • 相关阅读:
    PHP浮点数引起的四舍五入问题
    几项有用的JQUERY代码
    php5.5新特性之yield理解
    【转】循环、迭代、遍历和递归
    phpexcel导入excel文件报the filename xxx is not recognised as an OLE file错误。
    php缩放gif和png格式透明背景变成黑色的解决方法
    javascript统计输入文本的简易方法
    分享几个实用的jquery工具函数
    thinkphp中ajax技术
    正斜杠与反斜杠
  • 原文地址:https://www.cnblogs.com/yueqian-scut/p/3952262.html
Copyright © 2011-2022 走看看