• [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具


    目录

    0.Linux项目自动化构建工具 - make/Makefile

    1.make和makefile是什么?

    2.为什么要使用make和makefile?

    3. 怎么创建makefile

    3.1  编写makefile

    3.1.1 依赖关系

    3.1.2 依赖方法

    3.2 使用make

    3.2.1 make的原理

    3.2.2 查看文件修改时间

    3.3 编写项目清理

    3.3.1 如何编写项目清理

    3.3.2 clean详解 


    0.Linux项目自动化构建工具 - make/Makefile

    1.make和makefile是什么?

    make是一个命令,makefile是一个文件

    2.为什么要使用make和makefile?

    首先我们仍然写一段最简单的代码来供我们参考

    1. #include
    2. int main()
    3. {
    4. printf("hello world\n");
    5. return 0;
    6. }

    我们在上篇文章说过,如果要编译这段C语言代码,我们可以使用

    gcc test.c -o test

    我们发现结果没有问题。 

     如果我们不小心误写了gcc这行指令又会发生什么呢?

     

    此时我们再来查看发现源文件都被覆盖掉了

    为了避免这种问题的发生,我们可以使用makefile自动化构建工具。

    因此我们可以回答问什么要使用make/makefile:

    1.减少出现未定义的错误

    2.减少构建项目的成本

    3. 怎么创建makefile

    我们前面提到了makefile是一个文件,因此我们在当前路径下创建一个makefile

    touch Makefile

    3.1  编写makefile

     makefile:在当前路径下的一个普通文件

    makefil内部包含两个东西:1.依赖关系 2.依赖方法

    我们进入makefile输入

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

    注意:gcc要另起一行并且要先敲一个Tab键 

     

    3.1.1 依赖关系

    上面的文件 test ,它依赖 test.c
    

    3.1.2 依赖方法

    gcc test.c -o test 就是与之对应的依赖关系

    3.2 使用make

    至此我们一个最简单的makefile就写好了,现在我们只需要输入make命令就会在makefile中寻找依赖关系和依赖方法已经我们在makefile中表明的依赖方法。

     

    3.2.1 make的原理

    1.make会在当前目录下找名字叫做"makefile"或“Makefile”的文件。

    2.如果找到,他会找文件中的第一个目标文件,在上面的例子中,他会找到"test"这个文件,并把这个文件作为最终的目标文件

    3.如果test文件不存在,或是test所依赖的后面test.c文件的文件修改时间要比test这个文件新(可以用touch测试),那么他就会执行后面所定义的命令来生成test这个文件

    4.这就是make的依赖性,make会一层又一层的去找文件的依赖关系,知道最终编译出第一个目标文件

    5.在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。

    6.make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起, 我就不工作啦。

    上面第3点说到的,test所依赖的后面test,c文件的文件修改时间,以及test这个文件的修改时间,这又是什么意思呢?

    其实呀,这个是非常简单的,我们举例来说!

    我们写好makefile之后进行make,第一次make时会运行依赖方法,当我们不进行任何操作直接进行第二次make时,我们发现并没有执行依赖方法。而是告诉我们test目标文件已经是最新的了。这也非常的好理解,如果我们已经gcc一次之后生成了目标文件,如果我们不对源文件进行修改时,我们再次gcc时其实生成的目标文件没有进行修改,仍然是之前第一次的目标文件,因此系统就没必要再执行一次依赖方法。

    而当我们对test.c进行修改时,我们再次使用make,此时我们发现执行了依赖方法,这也非常好理解,系统发现源文件被修改,gcc之后形成的目标文件肯定和之前的目标文件不同,因此会执行依赖方法。这就是上面第3点所提到的问题。

    3.2.2 查看文件修改时间

     我们使用stat可以查看文件的修改时间

    stat 文件名称

    文件的时间有3个也叫ACM时间:

    Access:读取或进入文件的时间

    Modify:最后一次文件内容改变时间

    Change:最后一次文件属性改变时间

    假如我们改变一下源代码,我们发现修改文件的内容,Modify时间确实改变了,怎么chang time也发生了改变,这是因为修改文件内容可能会导致changtime的变化,内容变化后,属性可能会随之变化(比如文件的大小(size)).

    3.3 编写项目清理

    3.3.1 如何编写项目清理

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

    此时,我们使用make clean就会对所创建的目标文件进行清理

    3.3.2 clean详解 

    1.工程是需要被清理的

    2.像clean这种,没有被第一个目标文件直接或者间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令 -- “make clean”,以此来清楚所有的目标文件,以便重编译

    3.但是一般我们这种clean的目标文件,我们将设置为伪目标,用.PHONY 修饰,伪目标的特性是:总是被执行。

    (本篇完)

  • 相关阅读:
    一图读懂融云出海 & 全球化通信方案
    虚幻4学习笔记(15)读档 和存档 的实现
    [LeetCode]剑指 Offer 42. 连续子数组的最大和
    【洛谷算法题】P5707-上学迟到【入门1顺序结构】
    山东大学人工智能导论实验一 numpy的基本操作
    JavaScript/jQuery功能函数集
    接口测试结果字段太多,断言烦不胜烦,DeepDiff帮你一键搞定
    【754. 到达终点数字】
    将项目部署到Windows操作系统中,并且访问该项目
    8月算法训练------第十四天(数学)解题报告
  • 原文地址:https://blog.csdn.net/qq_58325487/article/details/126743446