makefile介绍
makefile是用来管理项目工程的文件,一旦写好,只需一个make命令,整个工程完全自动编译,极大的提高了软件开发的速度。
make是一个命令工具,是一个解释makefile中指令的命令工具,windows下的nmake,Linux下gnu的make。makefile会使用gcc编译器对源代码进行编译,最终生成可执行文件或者是库文件。
makefile的编写规则
目标:依赖
(tab)命令
第一个版本:
main:main.c fun1.c fun2.c sum.c
gcc -o main main.c fun1.c fun2.c sum.c
第二个版本
main: main.o fun1.o fun2.o sum.o
gcc -o main main.o fun1.o fun2.o sum.o
main.o: main.c
gcc -c main.c -I./
fun1.o: fun1.c
gcc -c fun1.c
fun2.o: fun2.c
gcc -c fun2.c
sum.o: sum.c
gcc -c sum.c
makefile中的变量
在makefile中使用变量有点类似于c寓意着的宏定义,使用该变量相当于内容替换,使用变量可以使makefile易于维护,修改起来变得简单
makefile有三种类型变量
普通变量
foo=abc //变量定义使用=
bar=(foo)//(foo)//(foo)//使用变量
自带变量
CC CPPFLAGS CFLAGS LDFLAGS
自动变量
$@:表示规则中的目标
$<: 表示规则中的第一个条件
$^:表示规则中的所有条件,组成一个列表,以空格隔开,如果这个列表中有重复的项则消除重复项
makefile中的模式规则
比如:main.o:main.c fun1.o:fun1.c 说的简单点就是xxx.o:xxx.c
第三个版本
target=main
object=main.o fun1.o fun2.o sum.o
cc=gcc
CPPFLAGS=-I./
$(target):$(object)
$(cc) -o $@ $^
%.o:%.c
$(cc) -c $< $(CPPFLAGS)
makefile函数
makefile函数很多,下面是两个最常见的
1。wildcard - 查找指定目录下的指定文件
src=$(wildcard*.c) //查找当前目录下所有后缀文件为.c的文件,赋值给src
2。patsubst - 匹配替换
obj=(patsubst(patsubst%.c,%.o,(patsubst(src))//把src变量里所有后缀为.c的文件替换成.o
sample
比如当前目录有 a.c b.c c.c d.c
src=$(wildcard*.c) //src= a.c b.c c.c d.c
obj=(patsubst(patsubst%.c,%.o,(patsubst(src)) //pbj=a.o b.o c.o d.o
第四个版本
target=main
src=$(wildcard*.c)
object=$(patsubst%.c,%.o,$(src))
cc=gcc
CPPFLAGS=-I./
$(target):$(object)
$(cc) -o $@ $^
%.o:%.c
$(cc) -c $< $(CPPFLAGS)
makefile的清理操作
用途:删除编译生成的中间.o文件和最终目标文件
第五个版本
target=main
src=$(wildcard*.c)
object=$(patsubst%.c,%.o,$(src))
cc=gcc
CPPFLAGS=-I./
$(target):$(object)
$(cc) -o $@ $^
%.o:%.c
$(cc) -c $< $(CPPFLAGS)
.PHONY:clean
clean:
rm -f $(object) $(target)
运行make命令会自动编译makefile文件的内容,但是不会执行makefile中clean方面的内容,要执行clean方面的内容要在shell上输入make clean