目录
- 会不会写Makefile,从侧面说明一个人是否具备完成大型工程的能力
- 一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,Makefile定义一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
- Makefile 带来的好处就是——" 自动化编译 ",一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。
- make 是一个命令工具,是一个解释 Makefile 中指令的命令工具,一般来说,大多数 IDE都有这个命令。
- make 是一个命令,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,否则就会报出当前文件已经是最新的提示。
现在我们使用Makefile 模拟多文件的生成和链接
类似于VS编译的 生成解决方案 和清理解决方案
如果开始没找到依赖关系中的文件便会自动向下执行寻找。
当向下寻找生成了 test.o 和 main.o 后,再执行 mytest 这对依赖关系和依赖方法,然后 mytest 就生成出来了。
- make 会在当前目录下找名字为" Makefile " 或 " makefile "的文件
- 如果找到,它会找文件中的一个目标文件 (target) ,在上面的例子中,他会找到 " hello "这个文件,并把这个文件作为最终的目标文件。
- 如果 hello 文件不存在,或是 hello 所依赖的后面的 hello.o 文件修改时间要比 hello 这个文件新,那么,他就会执行后面所定义的命令来生成 hello 这个文件。
- 如果 hello 所依赖的 hello.o 文件不存在,那么 make 会在当前文件中找目标为 hello.o的依赖性,如果找到则再根据那一个规则生成 hello.o 文件
- 当然,你的 C 文件和 H 文件是存在的,于是 make 会生成 hello.o 文件,然后再用 hello.o 文件声明 make 的终极任务,也就是执行文件 hello 了。
- 这就是整个 make 的依赖性,make 会一层一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
- 在寻找的过程中,如果出现错误,比如最后被依赖的文件找不到,那么 make 就会直接退出,并报错,而对于所定义的命令错误,或是编译不成功,make 不做反应。
- make 只管文件的依赖性,即,如果找到了依赖关系之后,冒号后面的文件还是不在,make 不执行。
- 工程是需要清理的
- 像 clean 这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可显示要make执行。即命令——" make clean " ,以此来清除所有的目标文件,以便重编译。
- 但是一般我们这种 clean 的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。
- 可以将我们的 hello 目标文件声明成伪目标。
基于gcc/g++的学习,我们使用Makefile 可以实现一个小程序——进度条
首先我们要先来了解一下C语言中的缓冲区
进度条小程序代码