在本章开始给大家分享一个图片 希望对你有帮助
在这里插入图片描述
🏆前言
在开始本章之前 我们需要回顾一下上节课的函数的动静态库的优缺点
动态库的优点: 比较节省资源(这里说的资源不仅仅是磁盘资源 也包括网络资源 内存资源等等),不会出现太多的重复代码
缺点:对库的依赖性较强,一旦库丢失 那么所有使用这个库的程序就无法运行,具体理解见上一篇Linux博客
静态库的优点:不依赖库,同类型平台中都可以直接使用
缺点:可执行程序体积比较大 浪费资源
🔭1.Linux项目自动化构建工具——make/Makefile
🍧背景
会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命
令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一
种在工程方面的编译方法
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建
🌅理解
1.快速使用一下make/Makefile
2.解释一下依赖关系和依赖方法
3.make/Makefile
1.
这里的mybin是目标文件 mytest.c是依赖文件列表 下一行的空格是Tab键——语法要求
2.尝试着按照你和你同学 你同学向你借一下作业给他抄 思考一下你为什么要给他抄 你应该如何给他抄呢 你和他之间的依赖关系和依赖方法是什么
认识一下时间:
在Linux当中 我们的文件的大小是由文件的内容和属性构成的 那么我们的时间在Linux当中也有Modify Change之分 当我们对文件做出改动时 我们此时就要注意一下Change是否变化了 并且Modify和Change是联动变化的
思考:mybin是否最新 如何知道mybin最新?make/Makefile是如何知道可执行程序是比较新的呢?
通过对比时间 可执行程序的最近修改时间比所有源文件的最近修改时间新则是最新
这里有点错误 应该将mybin改成clean 这段代码的意思是将clean这种目标文件设置成伪目标 .PHONY意思是clean总是被执行的
看下面这段代码 需要结合我们学过的程序的编译和预处理的知识
我们来对上述的make/Makefile的语法推导过程做一下解释
.PHONY:clean
clean:
rm -f hello.i hello.s hello.o hello
🏆依赖关系
上面的文件 hello ,它依赖 hello.o
hello.o , 它依赖 hello.s
hello.s , 它依赖 hello.i
hello.i , 它依赖 hello.c
🏆依赖方法
gcc hello.* -option hello.* ,就是与之对应的依赖关系
🃏原理
make是如何工作的,在默认的方式下,也就是我们只输入make命令。那么
🃏1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
🃏2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“hello”这个文件,并把这个文件作为最终的目标文件。
🃏3. 如果hello文件不存在,或是hello所依赖的后面的hello.o文件的文件修改时间要比hello这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成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只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦
🌈项目清理
工程是需要被清理的
像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译
但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。
可以将我们的 hello 目标文件声明成伪目标,测试一下
🌈2.Linux第一个小程序——进度条
这里需要涉及到缓冲区的知识 由于我们现在的知识有限 等我们到了基础IO部分我们会给大家详细讲解缓冲区的众多细节 现在大家记住代码是如何写的就行了
这里还需要了解一个知识点就是换行和回车的意思 这里的顺序是不一样的 先换行向下平移 然后再回车走到下一行的行首
这就是我们的简单版本的进度条 我们使用指令打印出来看一看
当然这个也不是很完善的代码 下一篇文章我们给大家呈现更完整的进度条代码 模拟实现进度条在不同场景下的使用