什么是Makefile:
⼀个⼯程中的源⽂件不计数,其按类型、功能、模块分别放在若⼲个⽬录中,makefile定义了⼀系列的规则来指定,哪些⽂件需要先编译,哪些⽂件需要后编译,哪些⽂件需要重新编译,甚⾄于进⾏更复杂的功能操作,因为makefile就像⼀个Shell脚本⼀样,其中也可以执⾏操作系统的命令。
Makefile的作用:
makefile的作用就是——“⾃动化编译”,即把工程中的各类源文件按照开发者在Makefile里定义的一系列规则来编译,,⼀旦写好,只需要⼀个make命令,整个⼯程完全⾃动编译,极⼤的提⾼了软件开发的效率。
Makefile的编译规则
假设我们的工程中定义有多个头文件和多个C文件
1.如果这个⼯程没有编译过,那么我们的所有C⽂件都要编译并被链接。
2.如果这个⼯程的某⼏个C⽂件被修改,那么我们只编译被修改的C⽂件,并链接⽬标程序。
3.如果这个⼯程的头⽂件被改变了,那么我们需要编译引⽤了这⼏个头⽂件的C⽂件,并链接⽬标程序。
Makefile的书写格式为:
target : prerequisites
command
其中:
target:一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签
prerequisites:要生成那个target所需要的文件或是目标
command:是make需要执行的命令。(任意的Shell命令)
Makefile的简单编写
首先创建一个Makefile文件和test.c文件
按照编写规则在Makefile里完成编写,如下图
在test.c文件里也完成一个简单的函数编写
make的工作过程
1 make会在当前⽬录下找名字叫“Makefile”或“makefile”的⽂件。
2 如果找到,它会找⽂件中的第⼀个⽬标⽂件(target),在上⾯的
例⼦中,他会找到“edit”这个⽂件,并把这个⽂件作为最终的⽬标⽂
件。
3 如果edit⽂件不存在,或是edit所依赖的后⾯的 .o ⽂件的⽂件修改
时间要⽐edit这个⽂件新,那么,他就会执⾏后⾯所定义的命令来⽣
成edit这个⽂件。
4 如果edit所依赖的.o⽂件也存在,那么make会在当前⽂件中找⽬标
为.o⽂件的依赖性,如果找到则再根据那⼀个规则⽣成.o⽂件。(这
有点像⼀个堆栈的过程)
5 当然,你的C⽂件和H⽂件是存在的啦,于是make会⽣成 .o ⽂件,
然后再⽤ .o ⽂件声明make的终极任务,也就是执⾏⽂件edit了。
此时输入make命令,生成执行文件edit。输入 ls显示文件目录,可发现多了test文件和test.o文件。再输入 ./test 执行可执行文件test。如下图
输入 make clean,可清除所有的目标文件,以便重新编译。每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁。
在清空目标文件时需要注意的问题是伪目标.PHONY
.PHONY : clean
clean :
-rm edit $(objects)
.PHONY 意思表⽰clean是⼀个“伪⽬标”。⽽在rm命令前⾯加了⼀个⼩减号的意思就是,也许某些⽂件出现问题,但不要管,继续做后⾯的事。当然,clean的规则不要放在⽂件的开头,不然,这就会变成make的默认⽬标。不成⽂的规矩是——“clean从来都是放在⽂件的最后”。
伪目标可以是没有依赖文件的目标文件,例如clean就可以定义为伪目标,防止误触发。或者在一个Makefile里面你想一次make生成多个可执行文件,也可以利用伪目标的定义。