zoukankan      html  css  js  c++  java
  • 关于makefile

    1. 基本规则:
      target...: prerequisites ...(预备知识,先决条件)

        command(指令)
      
    2. 引用其它的Makefile
      在include前面可以有一些空字符,但是绝不能是[Tab]键开始。include和可以用一个或多个空格隔开。举个例子,你有这样几个Makefile:a.mk、b.mk、c.mk,还有一个文件叫foo.make,以及一个变量$(bar),其包含了e.mk和f.mk,那么,下面的语句:

      include foo.make *.mk $(bar)

    如果文件都没有指定绝对路径或是相对路径的话,make会在当前目录下首先寻找,如果当前目录下没有找到,那么,make还会在下面的几个目录下找:

             1.如果make执行时,有“-I”或“--include-dir”参数,那么make就会在这个参数所指定的目录下去寻找。
    
             2.如果目录/include(一般是:/usr/local/bin或/usr/include)存在的话,make也会去找。
    

    3、 make的工作方式

    GNU的make工作时的执行步骤入下:(想来其它的make也是类似)

      (1).    读入所有的Makefile。
    
      (2).    读入被include的其它Makefile。
    
      (3).    初始化文件中的变量。
    
      (4).    推导隐晦规则,并分析所有规则。
    
      (5).    为所有的目标文件创建依赖关系链。
    
      (6).    根据依赖关系,决定哪些目标要重新生成。
    
      (7).    执行生成命令。
    

    4、 为了避免和文件重名的这种情况,我们可以使用一个特殊的标记“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。
    .PHONY: clean

    clean:

           rm*.o temp
    
    1. 静态模式

      objects: foo.o bar.o
      all: $(objects)
      $(objects): %o:%c
      $(cc) -c $(CFLAGS) $< -o $@

      file: foo.elc bar.o lose.o
      $(filter %.o, %(file)): %.o:%c
      $(cc) -c %(CFLAGS) $< -o $@

    2. 自动生成依赖性
      大多数的C/C++编译器都支持一个“-M”的选项,即自动找寻源文件中包含的头文件,并生成一个依赖关系。如果你使用GNU的C/C++编译器,你得用“-MM”参数,不然,“-M”参数会把一些标准库的头文件也包含进来。
      [.d]文件中就存放对应[.c]文件的依赖关系。

    3. Makefile 书写命令

    (1). @加在命令开头,不会输出命令

    (2)我们可以在Makefile的命令行前加一个减号“-”(在Tab键之后),标记为不管命令出不出错都认为是成功的。

    1. 自动化变量
      $@
      表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。
      $%
      仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a(bar.o)",那么,"$%"就是"bar.o","$@"就是"foo.a"。如果目标不是函数库文件(Unix下是
      [.a],Windows下是[.lib]),那么,其值为空。
      $<
      依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。
      $?
      所有比目标新的依赖目标的集合。以空格分隔。
      $^
      所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。
      $+
      这个变量很像"$^",也是所有依赖目标的集合。只是它不去除重复的依赖目标。
      $*
      这个变量表示目标模式中"%"及其之前的部分。如果目标是"dir/a.foo.b",并且目标的模式是"a.%.b",那么,"$*"的值就是"dir /a.foo"。9
  • 相关阅读:
    Liskov替换原则
    OCP开放封闭原则
    SRC单一职责原则
    什么是敏捷设计
    [WCF编程]13.并发:服务并发模式
    [WCF编程]12.事务:服务事务编程(下)
    [WCF编程]12.事务:服务事务编程(上)
    [WCF编程]12.事务:Transaction类
    [WCF编程]12.事务:事务传播
    [WCF编程]12.事务:事务协议与管理器
  • 原文地址:https://www.cnblogs.com/linbingfeng/p/9189016.html
Copyright © 2011-2022 走看看