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

发布于:2023-01-20 ⋅ 阅读:(16) ⋅ 点赞:(0) ⋅ 评论:(0)

一、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语言中的缓冲区 

进度条小程序代码