• [Linux 基础] make、Makefile自动化构建代码工具


    在这里插入图片描述

    1、make与Makefile是什么

    make是一个命令,Makefile是一个在当前目录下存在的一个具有特定格式的文本文件。

    2、为什么要有make与Makefile

    在VS编译器中,我们在编译执行代码的时候ctrl+f5就可以了,而在linux中我们需要使用gcc/g++ 配合选项并需要正确的格式才可以完成编译,这样是比较麻烦的,我们make与Makefile可以实现自动化构建代码的,当写好代码,只需要一个make指令就能完成整个文件的自动编译。
    并且我们写gcc的时候可能会有错误,但是我们直接写到文件中,一次写正确,后面直接使用即可;
    我们能够编译,也要能够清理,也是这个道理,我们一次写正确,后面直接使用即可。

    3、怎么实现一个Makefile文件

    首先我们先创建一个makefile文件,这里makefile单词一定要输入正确,不能出现错误,首字母m可大写可小写,我这里是大写。

    touch Makefile/makefile //首字母m大写/小写都可以 
    
    • 1

    在这里插入图片描述

    3.1 如何编写Makefile文件

    Makefile是当前目录下的一个普通文本文件,内容包含依赖关系和依赖方法
    首先先进入Makefile文件中,然后输入以下内容

    test:test.c
        gcc -o test test.c     
    
    • 1
    • 2

    注意:我们在输入gcc 指令这一行的时候,必须要tab键。

    3.1.1 依赖关系

    在上面的Makefile中,test 依赖于 test.c

    3.1.2 依赖方法

    上面的Makefile中,gcc -o test test.c 就是依赖方法

    3.2 如何清理项目

    3.2.1 如何编写

    首先进入Makefile,输入以下内容

    .PHONY:clean
    clean:
    	rm -f test
    
    • 1
    • 2
    • 3

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/9d876e620e5f4da093328519e74993e1

    3.2.2 clean详解

    • 工程是需要被清理的
    • 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。
    • 但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的(依赖方法总是会被执行,不会被任何情况拦截)。

    3.3 make的使用

    当我们已经写好了Makefile文件后,我们直接输入make就可以自动编译代码了。

    当我们想要清理可执行文件,我们输入make clean即可。
    在这里插入图片描述
    如果我们在Makefile中先写的是清理,输入make执行的就是清理工作,所以谁在前make就执行谁。
    在这里插入图片描述

    一般我们将清理工作写在构建的后面。

    3.4 原理

    1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
    2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“test”这个文件,并把这个文件作为最终的目标文件。
    3. 如果test文件不存在,或是test所依赖的后面的test.c文件的文件修改时间要比test这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成test这个文件。
    4. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
    5. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。
    6. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。

    第三点可能会有疑惑,这里的意思其实是,当我们已经生成了可执行文件后,我们对test.c源文件进行修改,这时test.c的内容发生改变,我们再执行make,这时会生成新的可执行程序,如果没有更新内容,那么我们就没有必要再执行依赖方法。这是根据两个文件的时间进行对比,当源文件的时间大于可执行文件的时间就更新,本质还是看源文件的内容是否发生改变的,因此这里对比的就是Modify时间。

    在这里插入图片描述
    此时就是没有更新源文件,我们再去生成的时候就会报错说test是最新的。

    3.4.1 查看文件修改时间

    使用stat命令可以查看文件的修改时间。

    stat 文件名
    
    • 1

    在这里插入图片描述
    这里有三个时间,Access、Modify、Change也叫做ACM时间。

    Access:读取或进入文件的时间
    Modify:最后一次文件内容改变时间
    Change:最后一次文件属性改变时间

    当我们对源文件内容进行修改之后,Modify时间会随之改变,这时Change时间也可能会改变,因为文件内容的改变会引发属性发生改变(比如文件的大小),所以change时间可能就会随之改变。
    make就是根据源文件的修改时间与可执行文件的时间做对比,来选择是否要重新执行依赖方法。
    在这里插入图片描述
    这里我们可以看到源文件修改时间大于可执行文件修改时间,此时执行make,就会重新执行依赖方法,生成新的可执行文件。
    在这里插入图片描述
    在这里插入图片描述
    这时可执行文件的Modify时间大于源文件MOdify时间,再执行make就无效了,我们可以看看:

    我们还可以只修改指定的时间:

    touch -选项 文件名
    
    • 1

    在这里插入图片描述
    但是如果这里我们选择修改Access / Modify时间,Change时间也会跟着改变,因为时间也是属性,属性改变Change时间就会发生改变。
    一般情况下,我们读取文件的频率很高,文件是存在磁盘中,每次更改时间的本质都是在访问磁盘,效率低下,如果每次访问文件都去更新Access时间的话,Linux系统回充满大量的访问磁盘的IO操作,变相的减慢系统效率,因此更改Access时间,添加了次数限制。

  • 相关阅读:
    Xilinx ISE系列教程(7):QSPI编程文件的生成和烧录
    设置你的第一个React应用
    Llama2-Chinese项目:2.1-Atom-7B预训练
    golang 中 channel 的详细使用、使用注意事项及死锁分析
    FPGA零基础学习:IIC协议驱动设计
    36二叉树-翻转二叉树
    【深入研究Hotspot源码与Linux内核】
    mac 使用 homebrew 安装软件问题及处理方法
    QT用户登录注册,数据库实现
    《图解Pandas》内容汇总-20220822
  • 原文地址:https://blog.csdn.net/Ljy_cx_21_4_3/article/details/133993583