Linux下的Makefile基础知识

Makefile

1.是什么:

  1. 一个不普通的文本文件

  2. 普通是因为它就是一个文本文件

  3. 不普通是因为他可以辅助完成各种大型项目的编译,主要make这个程序

2.作用:

  • makefile用于记录这些项目中的编译规则,而make这个程序只是
    解释makefile中的这些编译规则,逐条解释(make只是解释这些规则,
    而编译工作还是最后由编译器来处理)

3.编写规则

  1. Makefile文件命名规则

          makefile/Makefile
    

    2.注释

          ‘#’号开头
    

    3.编写规则

      a.对象名称:依赖的对象名称
      b.[Tab][\t] 为了生成对象所执行的命令
    

make 执行规则

  • 1.先找到目标文件

  • 只生成第一个对象,当第一个对象执行完退出,想要执行其他的对象,定义第一个对象为all:后面添加所有的依赖对象

  • 2.找到目标文件后,根据依赖的时间属性判断是否为最新的,判断是否需要编译如果为最新的就不会再编译

  • 3.执行为了生成对象所需的命令
    这条命令,不一定非要生成目标对象

  • 4.make 在直接在外部指定要执行生成的对象(make clean)

4.伪对象

  1. 概念:
  • 伪对象中的不管对象是不是最新的,都需要重新生成
  1. 申明的格式
  • .PHONY: 定义伪对象关键字

  • 将clean声明为伪对象,就是为了防止外部有和clean同名的文件,导致出现因为引用文件最新而不重新执行命令的问题

       .PHONY: celan  
       clean:
       tal键  rm  test
    

5.预定义变量

  • 用于执行命令

  • $@ : 目标对象

  • $^ : 所有的依赖对象

  • $<:所依赖对象中的第一个

  • $(): 用于使用一个变量

  • wildcard : 关键字,用于获取文件名 ```src=$(wlidcard ./*.c)

         定义一个变量获取当前路径下所有的.c 文件名
    

6. = := ?= += 他们之间有什么区别

  1. = 是最基本的赋值,修改整个makefile的同名变量的值
  • “=”这是递归展开式变量 定义若是引用了其他变量,引用会一直展开下去直到找到别引用变量的最新定义,并以此为变量的值返回

             例子:
                         x = foo        
                         y = $(x) bar            
    
  • List item

                         x = xyz                       
             最后y为xyz
           他展开的整个makefile,makefile中的值是最后定义的值
    
  1. := 是覆盖之前的值,变量在不同位置的值不同,他只修改在:=之后的值,之前的值不管
  • “:=”(计时赋值) 简单展开变量 这种方式定义的变量,会在变量的定义点,
    按照被引用的变量的当前值进行展开()

             例子:
                           x := foo          
                           y := $(x) bar         
                            x := xyz   
                      在上例中,y的值将会是 foo bar  ,而不是 xyz bar 了。
    
  • := 表示变量的值取决于它在makefile中的位置而不是整个makefile展开后的最终值。

  1. += 是添加等号后面的值

          “+=”与“=”功能几乎相同,但是当变量已经有定义时,+=只是简单的进行字符添加工作
    
  2. ?= 是如果没有被赋值过就赋予等号后面的值

          “?=”赋予默认值,没有初始化该变量,就给它赋上默认值 
    

你可能感兴趣的:(linux)