概述
工程中的源文件很多,一般都是按类型、功能、模块分别放在各个目录中
makefile 定义了一系列的规则来指定,哪些文件先编译,哪些文件后编译,哪些文件重新编译,还有些进行更复杂的功能操作
makefile 好处:“自动化编译”,只需要 make 命令,整个工程完全自动编译,提高了开发的效率
make :解释 makefile 中指令的命令工具
遵循于 IEEE 1003.2-1992 标准的(POSIX.2)
程序的编译和链接
编译(compile):把源文件编译成中间代码文件(Object File)(O 文件或 OBJ 文件)
链接(link):大量的 Object File 合成 执行文件
可把中间目标文件打个包( Archive File): .a 文件
Makefile 介绍
规则:
工程没有编译过,那所有 C 文件都要编译并被链接
工程的某些 C 文件被修改,那只编译被修改的 C 文件,并链接目标程序
工程的头文件改变,那就需要编译引用这些头文件的 C 文件,并链接目标程序
# target:目标文件、 Object File、执行文件、标签(Label
# prerequisites:生成 target 需要的文件、目标
# command:make 需要执行的命令
# prerequisites中有一个以上的文件比 target 文件更新,command 就会被执行
target ... : prerequisites ...
command
# make : 成执行文件 text
# make clean : 删除执行文件和所有的中间目标文件
# 目标文件(target):执行文件(text) , 中间目标文件(*.o)
# 依赖文件(prerequisites):' : '后面的 .c 文件和 .h 文件
# 一定要以一个 Tab 键作为开头
text : mian.o command.o files.o
cc -o text mian.o command.o files.o
main.o : main.c command.h files.h
cc -c main.c
command.o : command.c command.h
cc -c command.c
files.o : files.c files.h
cc -c files.c
# 冒号后什么没有,那么 make 就不会自动去找文件的依赖性
clean :
rm text mian.o command.o files.o
make 是如何工作的
make 会在当前目录下找名字叫“Makefile”或“makefile”的文件
找到,它会找文件中的第一个目标文件(target), 例子中,他会找到“ text ”这个文件,并把这个文件作为最终的目标文件
text 文件不存在 或 text 所依赖的后面的 .o 文件的文件更新了,就会执行后面所定义的命令来生成 text文件
text 依赖的.o 文件存在,那 make 会在当前文件中找目标为.o 文件的依赖性,找到则规则生成.o 文件
C 文件和 H 文件是存在, make 会生成 .o 文件, 然后再用 .o 文件 make ,也就是执行文件 text
整个 make 的依赖性,make 会一层又一层地去找文件的依赖关系,最终编译出第一个目标文件
如果出现错误,make 会直接退出,并报错
makefile 中使用变量
为了 makefile 的易维护,在 makefile 中可以使用变量
# 定义一个变量
OBJECTS = mian.o command.o files.o
text : $(OBJECTS)
cc -o text $(OBJECTS)
main.o : main.c command.h files.h
cc -c main.c
command.o : command.c command.h
cc -c command.c
files.o : files.c files.h
cc -c files.c
# 冒号后什么没有,那么 make 就不会自动去找文件的依赖性
clean :
rm text $(OBJECTS)
make 自动推导
make 会自动推导文件以及文件依赖关系后面的命令
只要 make 看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中
# make 的“ 隐晦规则 ”
OBJECTS = mian.o command.o files.o
text : $(OBJECTS)
main.o : command.h files.h
command.o : command.h
files.o : files.h
# ' .PHONY '表示,clean: 伪目标文件
# clean 放在文件的最后
# -rm :某些文件出现问题不用管,继续执行
.PHONY : clean
clean :
-rm text $(OBJECTS)