如何编写简单的Makefile⽂件
⼀、什么是Makefile
1.GNU make是⼀个命令⼯具,是⼀个⽤来控制软件构建过程的⾃动化管理⼯具。Make⼯具通过称为Makefile的⽂件完成并⾃动维护编译⼯作。
3、makefile定义了⼀系列的规则来指定,⼀个⼯程中的哪些⽂件需要先编译,哪些⽂件需要后编译,哪些⽂件需要重新编译,甚⾄于进⾏更复杂的功能操作。
总之,makefile为我们带来了极⼤地好处—–“⾃动化编译”,⼀旦编译成功,只要我们使⽤⼀个make⼯具,整个⼯程就完全⾃动化编译,为软件开发提⾼了效率。
⼆、Makefile⽂件编写规则
1、基本构成
⽬标⽂件列表 分隔符 依赖⽂件列表
[命令]
[命令]
单独的命令⾏要以tab键开始
# 代表注释⾏标志
⽬标可以是⼀个或多个,可以是Object File,也可以是执⾏⽂件,甚⾄可以是⼀个标签。
依赖⽂件列表就是⽣成⽬标所需要的⽂件或⽬标
命令就是⽣成⽬标所需要执⾏的脚本
2、Makefile的组成部分
⼀个完整的Makefile⽂件主要有以下及部分构成:
(1)显式规则
所谓显式规则就是显式指定依赖⽂件或命令,例如:
test:test.c
gcc -o test test.c
makefile phony当我们想⽣成⼀个可执⾏⽂件test时,这个test⽂件依赖与test.c⽂件,就可以⽤上⾯的格式进⾏编写,切记要在命令⾏前⾯加上tab键(2)隐含规则
所谓隐含规则就是需要⾃动推导⽂件以及依赖⽂件后⾯的命令,不需要我们把每⼀个⽂件都写全,只要make看到⼀个[.o]⽂件,它就会⾃动的把[.c]⽂件加在依赖关系中,如果make到⼀ 个whatever.o,那么whatever.c,就会是whatever.o的依赖⽂件。并且 cc -c whatever.c 也会被推导出来,于是,我们的makefile再也不⽤写得这么复杂。
⼀个例⼦来帮助我们理解⼀下:
objects = main.o command.o display.o /
insert.o search.o
edit : $(objects)
cc -o edit $(objects)
main.o : defs.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
clean :
rm edit $(objects)
这⾥有很多[.o]⽂件的依赖关系,看起来代码很复杂,很多,那么我们就可以使⽤隐含规则的推导功能重新写这个Makefile:
objects = main.o command.o display.o /
insert.o search.o
edit : $(objects)
cc -o edit $(objects)
$(objects) : defs.h
command.o : command.h
display.o insert.o search.o : buffer.h
clean :
rm edit $(objects)
这样看起来就简单很多,但是也有缺点,这样修改会破坏⽂件本⾝的依赖关系
(3)伪⽬标
它不代表⼀个真正的⽂件名,在执⾏make时可以指定这个⽬标来执⾏其所在规则定义的命令,有时我们也可以将⼀个伪⽬标称为标签。
使⽤伪⽬标有两点原因:
1. 避免在我们的Makefile中定义的只执⾏命令的⽬标(此⽬标的⽬的为了执⾏⼀系列命令,⽽不需要创建这个⽬标)和⼯作⽬录下的实际⽂件出现名字冲突。
2. 提⾼执⾏make时的效率,特别是对于⼀个⼤型的⼯程来说,编译的效率也许你同样关⼼。
例如:
clean:
rm -f .o temp
这⾥的“rm”并不是创建“clean”⽂件,⽽是删除当前⽬录下的所有.o和temp⽂件,但是当当前⽬录下没有clean⽂件时,当我们输
⼊“make clean”时,rm这⼀⾏命令总会被执⾏,但是当存在clean⽂件时,在我们输⼊“make clean”时。规则没有依赖⽂件,所以⽬标被认为是最新的⽽不去执⾏规则作定义的命令,命令“rm”将不会被执⾏。
但这并不是我们期望的结果,所以这时候就可以将clean⽂件定义成伪⽬标,就不会存在这种情况了;
.PHONY : clean
这样,不管是否存在clean⽂件,我们输⼊“make clean”之后。“rm”命令都会被执⾏。
(3)特殊⽬标
.PHONY 所有的依赖被作为伪⽬标
.IGNORE 后⾯的依赖⽂件,⽣成这些⽂件的命令在执⾏时如果出现错误,将被忽略继续执⾏
.SUFFIXES 该⽬标的依赖⽂件被认为是⼀个后缀列表
.SILENT 执⾏⽣成依赖⽂件的命令时不会打印所执⾏的命令
.PRECLOUS 该⽬标的依赖⽂件会受到特殊对待,如果make被终⽌,或者终⽌,这些依赖并不会被删除,如果是中间⽂件,不需要时也不会删除
.INTERMEDIATE ⽬标依赖⽂件在make执⾏时被当做中间⽂件对待
(4)使⽤变量
定义变量的形式:变量名 赋值符 变量值
引⽤变量:要使⽤$$来表⽰
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论