zoukankan      html  css  js  c++  java
  • Makefile学习笔记——Makefile的工作流程

    Makefile的工作流程:

    通过一个具体例子来理解Makefile的工作流程:

    main:main.o test1.o test2.o
    gcc main.o test1.o test2.o -o main
    main.o:main.c test.h
    gcc -c main.c -o main.o
    test1.o:test1.c test.h
    gcc -c test1.c -o test1.o
    test2.o:test2.c test.h
    gcc -c test2.c -o test2.o
    

      

    默认情况下,make执行的是Makefile中的第一规则,此规则的第一目标成为“最终目标”或者“终极目标”。

    根据Makefile的规则,我们在shell命令行执行make命令后,可以得到可执行文件“main”和中间文件“main.o”、“test1.o”、“test2.o”,其中,“main”就是终极目标。当修改过任何它依赖的C文件,执行make命令就会重建main终极目标。

    它的具体工作顺序是:当在 shell 提示符下输入 make 命令以后。 make 读取当前目录下的 Makefile 文件,并将 Makefile 文件中的第一个目标作为其执行的“终极目标”,开始处理第一个规则(终极目标所在的规则)。在我们的例子中,第一个规则就是目标 "main" 所在的规则。规则描述了 "main" 的依赖关系,并定义了链接 ".o" 文件生成目标 "main" 的命令;make 在执行这个规则所定义的命令之前,首先处理目标 "main" 的所有的依赖文件(例子中的那些 ".o" 文件)的更新规则(以这些 ".o" 文件为目标的规则)。

    对这些 ".o" 文件为目标的规则处理有下列三种情况:

    • 目标 ".o" 文件不存在,使用其描述规则创建它;
    • 目标 ".o" 文件存在,目标 ".o" 文件所依赖的 ".c" 源文件 ".h" 文件中的任何一个比目标 ".o" 文件“更新”(在上一次 make 之后被修改)。则根据规则重新编译生成它;
    • 目标 ".o" 文件存在,目标 ".o" 文件比它的任何一个依赖文件(".c" 源文件、".h" 文件)“更新”(它的依赖文件在上一次 make 之后没有被修改),则什么也不做。

    通过上面的更新规则我们可以了解到中间文件的作用,也就是编译时生成的 ".o" 文件。作用是检查某个源文件是不是进行过修改,最终目标文件是不是需要重建。我们执行 make 命令时,只有修改过的源文件或者是不存在的目标文件会进行重建,而那些没有改变的文件不用重新编译,这样在很大程度上节省时间,提高编程效率。小的工程项目可能体会不到,项目工程文件越大,效果才越明显。

    当然 make 命令能否顺利的执行,还在于我们是否制定了正确的的依赖规则,当前目录下是不是存在需要的依赖文件,只要任意一点不满足,我们在执行 make 的时候就会出错。所以完成一个正确的 Makefile 不是一件简单的事情。

    清除工作目录中的过程文件

    我们在使用的时候会产生中间文件会让整个文件看起来很乱,所以在编写 Makefile 文件的时候会在末尾加上这样的规则语句:

    .PHONY:clean
    clean:
    rm -rf *.o test
    

      

    其中 "*.o" 是执行过程中产生的中间文件,"test" 是最终生成的执行文件。我们可以看到 clean 是独立的,它只是一个伪目标(在《Makefile伪目标》的章节中详细介绍),不是具体的文件。不会与第一个目标文件相关联,所以我们在执行 make 的时候也不会执行下面的命令。在shell 中执行 "make clean" 命令,编译时的中间文件和生成的最终目标文件都会被清除,方便我们下次的使用。

    原文链接:http://c.biancheng.net/view/7091.html

  • 相关阅读:
    你敢说自己了解单例模式?
    关于线程池,那些你还不知道的事
    Dubbo透传traceId/logid的一种思路
    当BeanUtils遇到泛型
    Oval框架如何校验枚举类型的一种思路
    HttpClient(4.5.x)正确的使用姿势
    HttpClient官方sample代码的深入分析(连接池)
    Jaxb如何优雅的处理CData
    JAXB性能优化
    Jaxb对xml报文头的小修小改
  • 原文地址:https://www.cnblogs.com/young-dalong/p/15152375.html
Copyright © 2011-2022 走看看