问题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的隐含规则数据库

 

posted on 2024-01-29 20:39  tablong  阅读(4)  评论(0编辑  收藏  举报