项目自动化构建工具-make/Makefile
- make与Makefile
- 单文件Makefile
- 多文件Makefile
- 缓冲区
首先理清多文件之间的关系:
这里为什么没有包含test.h头文件?因为在当前工作目录下,因此不需要包含test.h,如果把test.h移到上一级目录,则就不会编译通过了
再将test.h移动到当前路径下,则就可以编译通过了
一般建议先形成目标文件,再将目标文件进行链接形成可执行文件(一般建议这样子进行,因为若进行100个文件进行编译,用上面那种方法,需要编译100个文件,而用现在这种先编译后链接的方法好处是,若有一个文件修改了,则只需要将这一个文件重新进行编译 然后再去链接 而不是重新编译100个文件)
make与Makefile
会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
make是一条命令,makefile(或Makefile)是一个文件,两个搭配使用,完成项目自动化构建。
单文件Makefile
首先对于单个test.c文件来说:
makefile中所放的是依赖关系和依赖方法
Makefile所包含的:依赖关系、依赖方法
之后对test.c进行任何修改以后,只需要重新输入make即可自动编译
即:
最后生成完也可以把临时文件清理掉
执行完进行清理工作
多文件Makefile
对于多文件的编译方法:
默认生成同名的.o文件
同理加上清理资源的代码:
清理完即:
扩展:
缓冲区
ls > Makefile 可以让文件名重定向写入文件中
则此时Makefile默认为:
修改为:
想让一条指令执行完接着执行下一条指令中间加;
ls;pwd
注意此处:
printf中含有\n的时候,是先打印的hello world 最后再进行的sleep(5)
但是去掉\n后:
是先sleep(5)之后再输出的hello world 这是为什么?
在 Linux 中,printf(“hello world”) 的输出延迟到 sleep(5) 之后显示,是因为 标准输出(stdout)的缓冲机制 导致的。
#include "proc.h"
int main() {printf("hello world"); // 输出内容在缓冲区中,未立即刷新// 注意此时printf是先执行的,但是并不代表是先打印的sleep(5); // 程序休眠 5 秒,缓冲区未刷新return 0; // 程序结束,刷新缓冲区,显示内容
}
行缓冲(Line Buffering):
当程序向终端输出时,stdout 默认采用行缓冲模式。此时,只有满足以下条件之一,缓冲区的内容才会被刷新(显示到终端):遇到换行符 \n、缓冲区被填满、程序正常结束(如 main 函数返回)。
全缓冲(Full Buffering):
如果 stdout 被重定向到 文件,则采用全缓冲模式,此时必须手动刷新或缓冲区填满才会输出。
总结:
\n:回车换行
\r回车:光标回到本行的最开始 不断打印重复内容 覆盖上次内容以实现一个动态内容
fflush:立即刷新出来而非等缓冲区