目录一.认识make和makefile1.1背景1.2如何理解make和makefile1.3基本使用1.4推导过程1.5适度扩展语法一.认识make和makefile1.1背景会不会写makefile从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数其按类型、功能、模块分别放在若干个目录中makefile定义了一系列的规则来指定哪些文件需要先编译哪些文件需要后编译哪些文件需要重新编译甚至于进行更复杂的功能操作makefile带来的好处就是——“自动化编译”一旦写好只需要一个make命令整个工程完全自动编译极大的提高了软件开发的效率。make是一个命令工具是一个解释makefile中指令的命令工具一般来说大多数的IDE都有这个命令比如Delphi的makeVisual C的nmakeLinux下GNU的make。可见makefile都成为了一种在工程方面的编译方法。make是一条命令makefile是一个文件两个搭配使用完成项目自动化构建。1.2如何理解make和makefile概念Makefile是一个文本配置文件里面写好编译规则、依赖关系记录项目中文件之间依赖、编译顺序、执行命令。makeLinux 下的命令工具用来读取、解析 Makefile 文件按照规则自动化编译项目。一句话make是工具程序Makefile是它读的脚本文件两者配合完成项目自动化构建编译。解决什么问题大型 C 项目有大量.c源文件如果每次手动敲 gcc 命令文件很多命令很长敲写麻烦修改一个.c全部文件都要重新编译速度慢Makefile 会记录文件依赖关系如果 A 文件依赖 B 文件B 修改了才重新编译 AB 没改动就跳过编译。只编译发生改动的文件不必全部重编译提升编译速度。1.3基本使用依赖关系上面的文件 test, 它依赖 test.c依赖方法gcc -o test taet.c, 就是与之对应的依赖关系为什么不用直接写 gcc要用 make直接敲 gcc 适合小文件大型工程文件数量多手写 gcc 命令繁琐易错。make 读取 Makefile根据文件时间戳 依赖关系只编译被修改过的文件不用全部重编译实现自动化构建提升效率。为什么编译用 make删除用 make cleanmake找目标文件test比对依赖源文件 (test.c) 时间戳执行编译生成可执行程序。clean 是伪目标一般不会生成名叫 clean 的文件专门写删除清理的 shell 命令用来删掉编译产物。为什么 make 编译只执行一次make clean 可以反复执行make 编译目标是test。只要test文件存在并且依赖的test.c没有更新时间戳对比后认为不需要重新生成提示is up to date不会重复执行 gcc。clean 伪目标不会生成 clean 这个文件。每次执行make clean没有文件用来比对时间戳所以每次都会执行里面的rm -f test命令可以执行多次。补充知识点伪目标.PHONY: clean声明 clean 为伪目标避免当前目录恰巧存在名为 clean 的普通文件导致 make clean 失效。什么叫总是被执行1.4推导过程make是如何工作的make是如何工作的,在默认的方式下也就是我们只输入make命令。那么make会在当前目录下找名字叫“Makefile”或“makefile”的文件。如果找到它会找文件中的第一个目标文件target在上面的例子中他会找到myproc这个文件并把这个文件作为最终的目标文件。如果myproc文件不存在或是myproc所依赖的后面的myproc.o文件的文件修改时间要比myproc这个文件新可以用touch测试那么他就会执行后面所定义的命令来生成myproc这个文件。如果myproc所依赖的myproc.o文件不存在那么make会在当前文件中找目标为myproc.o文件的依赖性如果找到则再根据那一个规则生成myproc.o文件。这有点像一个堆栈的过程当然你的C文件和H文件是存在的啦于是make会生成myproc.o文件然后再用myproc.o文件声明make的终极任务也就是执行文件hello了。这就是整个make的依赖性make会一层又一层地去找文件的依赖关系直到最终编译出第一个目标文件。在找寻的过程中如果出现错误比如最后被依赖的文件找不到那么make就会直接退出并报错而对于所定义的命令的错误或是编译不成功make根本不理。make只管文件的依赖性即如果在我找了依赖关系之后冒号后面的文件还是不在那么对不起我就不工作啦。1.5适度扩展语法