• 【Linux】基础开发工具——make/Makefile+进度条小程序


    一、make/Makefile背景

    • 会不会写Makefile,从侧面说明一个人是否具备完成大型工程的能力
    • 一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,Makefile定义一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
    • Makefile 带来的好处就是——" 自动化编译 ",一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。
    • make 是一个命令工具,是一个解释 Makefile 中指令的命令工具,一般来说,大多数 IDE都有这个命令。
    • make 是一个命令,Makefile 是一个文件,两个搭配使用,完成项目自动化构

    二、编写/运行 Makefile

    2.1 创建 Makefile 

    2.2 编写 Makefile

    编写依赖关系和依赖方法

    表示 mytest 文件是依赖 test.c 文件生成的,而依赖方法则可以写生成的指令

     其中.PHONY的最主要的特征是:总是被执行,我们以下面举例,如果我们一直重复生成 mytest ,会报出 "mytest is up to date" 表示当前生成的 " mytest "文件已经是最新的了,但是如果我们加上了 .PHONY 时,clean 指令一直执行,就不会报出上面那样的错误了。

    所以 .PHONY 的作用便一目了然了,总是会根据依赖关系,执行依赖方法。

    当然,我们也可以在 mytest 前也加上 .PHONY ,这样生成 " mytest " 也就不会报错那样的提示了,但是一般我们不会这样使用 .PHONY 。

     

    那这里有一个引申的问题,make是如何检测到当前文件是最新的呢?

    make检查两个文件中的ACM时间,如果文件(test.c)的修改时间晚于生成的 mytest ,则会正常生成 mytest,否则就会报出当前文件已经是最新的提示。

    2.3 编写 test.c

     2.4 运行


    三、多文件链接

    现在我们使用Makefile 模拟多文件的生成和链接 

    类似于VS编译的 生成解决方案 和清理解决方案

    如果开始没找到依赖关系中的文件便会自动向下执行寻找。

    当向下寻找生成了 test.o 和 main.o 后,再执行 mytest 这对依赖关系和依赖方法,然后 mytest 就生成出来了。


    四、make运行原理与总结

    • make是如何工作的,在默认的方式下,也就是我们只输入make命令。那么
    1. make 会在当前目录下找名字为" Makefile " 或 " makefile "的文件
    2. 如果找到,它会找文件中的一个目标文件 (target) ,在上面的例子中,他会找到 " hello "这个文件,并把这个文件作为最终的目标文件。
    3. 如果 hello 文件不存在,或是 hello 所依赖的后面的 hello.o 文件修改时间要比 hello 这个文件新,那么,他就会执行后面所定义的命令来生成 hello 这个文件。
    4. 如果 hello 所依赖的 hello.o 文件不存在,那么 make 会在当前文件中找目标为 hello.o的依赖性,如果找到则再根据那一个规则生成 hello.o 文件
    5. 当然,你的 C 文件和 H 文件是存在的,于是 make 会生成 hello.o 文件,然后再用 hello.o 文件声明 make 的终极任务,也就是执行文件 hello 了。
    6. 这就是整个 make 的依赖性,make 会一层一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
    7. 在寻找的过程中,如果出现错误,比如最后被依赖的文件找不到,那么 make 就会直接退出,并报错,而对于所定义的命令错误,或是编译不成功,make 不做反应。
    8. make 只管文件的依赖性,即,如果找到了依赖关系之后,冒号后面的文件还是不在,make 不执行。 
    • 项目清理
    • 工程是需要清理的
    • 像 clean 这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可显示要make执行。即命令——" make clean " ,以此来清除所有的目标文件,以便重编译。
    • 但是一般我们这种 clean 的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。
    • 可以将我们的 hello 目标文件声明成伪目标。

    五、进度条小程序

    基于gcc/g++的学习,我们使用Makefile 可以实现一个小程序——进度条

    首先我们要先来了解一下C语言中的缓冲区 

    进度条小程序代码

  • 相关阅读:
    抖音、微信关闭个性化推荐功能上线,用户真能摆脱“算法牢笼”吗?
    在GitHub上学黑客 --- 黑客成长技术清单
    只使用JS怎么给静态页面网站添加站内全局搜索功能?
    java“贪吃蛇”小游戏
    关于GPIO你真的懂了吗?这篇文章都给你整理好了
    换个地方写helloworld
    在matlab中使用模糊编辑器实现模糊控制器的设计详解
    搭建zerotier planet服务
    【python初学者日记】Mac版在pycharm中*.py文件点击run不运行
    2023_Spark_实验六:Scala面向对象部分演示(二)(IDEA开发)
  • 原文地址:https://blog.csdn.net/Brant_zero/article/details/126271715