makefile学习笔记-Makefile介绍(一个示例)

20180411 makefile学习笔记-Makefile介绍(一个示例)




make命令执行时,需要一个makefile文件,以告诉make命令需要怎样的去编译和链接程序;
eg:工程中有8个C文件和3个头文件,我们要编写一个Makefile来告诉make命令如何编译和链接这几个文件,我们的规则是:
(1)若这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
(2)若这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
(3)若这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。


只要我们的Makefile写的够好,所有的这一切,我们只用一个make命令就可以完成。


我们为了完成前面所述的那三个规则,我们的Makefile应该是下面这样的:


edit:main.o kbd.o command.o display.o \
insert.o search.o file.o utils.o
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o file.o utils.o


main.o:main.c defs.h
cc -c main.c
kbd.o:kbd.c defs.h command.h
cc -c kbd.c
command.o:command.c defs.h command.h
cc -c command.c
display.o:display.c defs.h buffer.h
cc -c display.c
insert.o:insert.c defs.h buffer.h
cc -c insert.c
search.o:search.c defs.h buffer.h
cc -c search.c
files.o:files.c defs.h buffer.h command.h
cc -c files.c
utils.o:utils.c defs.h
cc -c utils.c
clean:
rm edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o




反斜杠(\)是换行符的意思。这样写便于Makefile的阅读。
我们可以把这个内容保存在文件为“Makefile”或“makefile”的文件中,然后在该目录下直接输入命令“make”就可以生成执行文件edit,如果要删除执行文件和所有的中间目标文件,那么只要简单地执行一下“make clean”就可以了。




在这个makefile中,目标文件(target)包含:执行文件edit和中间目标文件(*.o),依赖文件(prerequisites)就是冒号后面的那些.c文件和.h文件。每一个.o文件都有一组依赖文件,而这些.o文件又是执行文件edit的依赖文件。依赖关系的实质上就是说明了目标文件是由哪些文件生成的,换言之,目标文件是哪些文件更新的。






在定义好依赖关系后,后续的那一行定义了如何生成目标文件的操作系统命令,一定要以一个Tab键作为开头,记住,make并不管命令是怎样工作的,他只管执行所定义的命令。make会比较targets文件和prerequisites文件的修改日期,若prerequisites文件的日期比targets文件的日期更新,或targets不存在的话,那么,make就会执行后续定义的命令。










这里要说明的一点是,clean不是一个文件,它只不过是一个动作名称,有点像C语言的label一样,其冒号后说明也没有,那么,make就不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。要执行其后的命令,就要在make命令后明显的指出这个label的名字,这样的方法非常有用,完美可以在一个makefile中定义不用的编译或是和编译无关的命令,比如程序的打包,程序的备份,等等。

猜你喜欢

转载自blog.csdn.net/weixin_39089680/article/details/79989707