Makefile的出现
什么是Makefile,有什么欲求导致Makefile的出现?
现实要求:
在实际开发中,不可能把所有程序放在一个.c文件里,否则会使代码臃肿,功能划分不明确,不利于程序员看代码。
即使做到了模块、功能、类型的划分,把它们放在不同的.c文件里,但如果只是改了一个文件,整个可执行的文件就要重新编译。(使工作量增加,出错率增加)
Makefile的优势
在Makefile里,我们可以根据自己对模块、类型、功能的需要,指定编译规则==》指定哪些文件要先编译(比如头文件),哪些文件要后编译,哪些文件要重新编译(如修改过的文件)
优势:①减少了不必要的编译错误②可以实现自动化编译,只需要在终端输入一个make指令,就可以把所有的.c文件根据Makefile规则编译成可执行文件。
Makefile规则
格式:[target]:[prerequisites]
(tab) [command]
target(目标文件):可以是.o文件也可以是可执行文件。
prerequisites:是要生成target文件所需要的文件。
command:把prerequisites生成target的命令。
就是说,当prerequisites中有文件比target中的文件新时,就会执行command规定的命令。
例:有add.c sub.c main.c 三个文件,要生成名字为demo的可执行文件。
demo:add.o sub.o main.o
gcc add.o sub.o main.o \
-o demo
add.o:add.c
gcc add.c -o add.o
sub.o:sub.c
gcc sub.c -o sub.o
main.o:main.c
gcc main.c -o main.o
.PHONY:clean
clean :
rm -f add.o sub.o main.o
Makefile的变量
令
OBJ=main.o add.o sub.o
CC=gcc
demo:$(OBJ)
$(CC) $(OBJ) \
-o demo
add.o:add.c
$(CC) add.c -o add.o
sub.o:sub.c
$(CC) sub.c -o sub.o
main.o:main.c
$(CC) main.c -o main.o
.PHONY:clean
clean :
rm -f $(OBJ)
makefile中包含了5样:生成规则、隐晦规则、变量定义、文件指示和注释
隐晦规则
make支持自动推导功能,只要make看到一个.o文件它就会把同名的.c文件放在依赖关系中,并且command也会自动推导出来。
OBJ=main.o add.o sub.o
CC=gcc
demo:$(OBJ)
$(CC) $(OBJ) \
-o demo
add.o:add.c
sub.o:sub.c
main.o:main.c
.PHONY:clean
clean :
rm -f $(OBJ)
清空.o文件件
有利于重新编译,也利于保持文件的清洁
这是标准格式:
.PHONY:clean
clean :
rm -f $(OBJ)
一般格式:
clean :
rm -f $(OBJ)
通配符的使用
通配符可以使我们的Makefile简化
通配符有 * 、? 、… 、
*.c:表示所有 后缀为.c 的文件。
*:表示*
OBJ=*.o
CC=gcc
demo:$(OBJ)
$(CC) $(OBJ) \
-o demo
add.o:add.c
$(CC) add.c -o add.o
sub.o:sub.c
$(CC) sub.c -o sub.o
main.o:main.c
$(CC) main.c -o main.o
.PHONY:clean
clean :
rm -f $(OBJ)