makefile介绍
一个工程必然会存在自己的目录结构,比如源文件,中间文件,可执行文件等等。在windows环境下我们常常不用关心如何去组织这些目录结构,因为在集成开发环境平台下这些工作这个IDE都为我们做好了而makefile就是linux下我们用来实现组织目录结构的工具。makefile 关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作, makefile 带来的好处就是——“自动化编译”,一旦写好,只需要一个make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。需要删除工程的时候也只需要一个make clean命令就把所有工程文件删除了。
有目录结构的存在,必然就有个目录结构中文件的依赖关系,和依赖方法。在makefile中的思想是“逆序”,比如,我们常常使用的编译链接过程是,源文件->预处理文件->汇编文件->目标文件->可执行文件,这种是属于顺序关系,后者的诞生必须要有前者的存在。而makefile的思想恰恰相反,它的“思考方式”是—可执行文件<-目标文件<-汇编文件<-预处理文件<-源文件.怎么理解呢?意思是要生成可执行程序必须要由目标文件来产生,而目标文件的产生要有汇编文件的存在,汇编文件的存在得有预处理的文件…直到源文件。上述的关系称为他们之间的依赖关系
。
而依赖方法
就是如何实现他们的依赖关系,比如在liunx下源文件生成预处理文件的依赖方法是gcc -E *.c -o *.i
makefile的使用方法:
target ... : prerequisites ... //依赖关系
command //方法方法(必须用Tab开头)
———————————————————————————
利用makefile方式 模拟实现进度条
背景知识:基于流的标准I/O的缓冲模式
基于流的标准I/O的缓冲模式有三种:全缓冲,半缓冲,无缓冲。
全缓冲:直到缓冲区被填满,才调用系统I/O函数。对于读操作来说,直到读入的内容的字节数等于缓冲区大小或者文件已经到达结尾,才进行实际的I/O操作,将外存文件内容读入缓冲区;对于写操作来说,直到缓冲区被填满,才进行实际的I/O操作,缓冲区内容写到外存文件中。磁盘文件通常是全缓冲的。
行缓冲:直到遇到换行符’\n’,才调用系统I/O库函数。对于读操作来说,遇到换行符’\n’才进行I/O操作,将所读内容读入缓冲区;对于写操作来说,遇到换行符’\n’才进行I/O操作,将缓冲区内容写到外存中。由于缓冲区的大小是有限的,所以当缓冲区被填满时,即使没有遇到换行符’\n’,也同样会进行实际的I/O操作。标准输入stdin和标准输出stdout默认都是行缓冲的。
无缓冲:没有缓冲区,数据会立即读入或者输出到外存文件和设备上。标准出错stderr是无缓冲的,这样保证错误提示和输出能够及时反馈给用户,供用户排除错误。
由于模拟实现进度条,所以需要实时检测进度条情况,则必须选择无缓冲模式。否则将达不到实时刷新输出缓冲区的目的。
源码实现
接下来,我们用makefile来简单的实现文件的编译链接等过程。编写makefile文件,编写依赖关系和依赖方法。
注:(1)依赖关系用冒号做间隔。(2)依赖方法必须用Tab键开头
执行make工具命令,实现依赖关系和相应结果:
执行生成的可执行文件proc
那么如何删除工程呢?还记得我们用伪依赖定义的标签clean吗?
执行make clean就可以删除所创建的工程文件了。对就是这么容易。
如果发现有需要改正的地方,还望大方指正!~