问题1:多个源文件参与的编译过程中,全部重新编译不合理;
gcc -c *.c
问题2:在手动处理过程中,由于一个基础文件的更改,导致后续的编译过程非常容易出错。
解决方法:编写makefile文件
$(sources:.c=.d)是一个变量替换语法,把sources变量中每一项的.c替换成.d
特殊变量:
$^ 表示规则中的所有条件,组成一个列表,以空格分隔,如果这个列表中有重复的项则将其消除。
$@ 表示规则中的目标
$< 表示规则中的第一个条件
$? 表示规则中所有比目标新的条件,组成一个列表,以空格分隔。
变量:
?=第一次定义有效。:=立即展开。=、+=建立依赖关系图后执行展开。
命令列表中@修饰只显示输出结果,-修饰的出错继续执行。
.PHONY: clean表示为目标
目标和条件之间的关系是:欲更新目标,必须先更新它的所有条件;所有条件中只要有一个条件被更新了,目标也必须随之被更新。
所谓“更新”就是执行一遍规则中的命令列表,命令列表中的每条命令必须以一个Tab开头,注意不能用空格代替这个Tab,Makefile的格式不像C语言的缩进那么随意。对于Makefile中的每个以Tab开头的命令,make会启动一个Shell进程去执行它。
约定俗成的目标名字有:
all,执行主要的编译工作,通常用作缺省目标。
install,执行编译后的安装工作,把可执行文件、配置文件、文档等分别复制到不同的安装目录。
clean,删除编译生成的二进制文件。
distclean,不仅删除编译生成的二进制文件,也删除其他的生成文件,比如内核源代码make menuconfig配置之后生成的.config文件,一些文档源文件(比如本书的Docbook源文件)经过make之后会转换生成HTML或PDF文件,执行make distclean应该清除所有的生成文件,只留下源文件。
make处理makefile的过程
1.从前到后读取所有规则,建立起完整的依赖关系图。
2.从缺省目标或者命令行指定的目标开始,根据依赖关系图选择适当的规则执行,执行Makefile中的规则和执行C代码不一样,并不是从前到后按顺序执行,也不是所有规则都要执行一遍,
常用的make命令:、
make -n 只打印要执行的命令,而不会真的执行命令(这称为Dry Run),这个选项有助于我们检查Makefile写得是否正确,
由于Makefile不是顺序执行的,用这个选项可以先看看命令的执行顺序,确认无误了再真正执行命令。 make -C 切换到另一个目录执行那个目录下的Makefile make -p 打印make的隐含规则数据库
标签:规则,Makefile,make,摘要,makefile,目标,编译,使用,执行 From: https://www.cnblogs.com/tablong/p/17995242