Makefile是一个文件,用来写入源代码编译规则,通过make命令执行。
以hello.c 为例
vi Makefile-------------
hello:hello.c
gcc hello.c -o hello
---------------------------------
在终端输入指令make,以此查找makefile、Makefile、MAKEFILE文件,进行编译
hello(目标文件):hello.c(依赖文件)
gcc -o hello hello.c (生成目标所需要的命令)
例如keil等编译器提供三种命令clean(清除编译文件) build(编译) rebuild(重编译)
所以makefile可以这样书写
------------------------------------------
hello:hello.c
gcc hello.c -o hello
clean: //清除不依赖文件
rm hello
rebuild:clean hello//重新编译依赖makefile的两个写好的编译目标指令,不需要命令
注意,如果一个目标依赖于另一个目标,则另一个目标先执行
在编译大型项目时,每次更改程序都导致全部重新编译,为提高效率,
编译过程只进行到汇编,生成机器码,未完成链接,这样一个源文件更改不会影响其他源文件编译。
main:main.o add.o del.o modify.o
gcc -o main main.o add.o del.o modify.o
main.o:main.c
gcc -c main.c
add.o:add.c
gcc -c add.c
del.o:del.c
gcc -c del.c
modify.o:modify.c
gcc -c modify.c
以上,虽然效率提高,但肉眼觉得很麻烦,我们可以简化,利用$@$^$<
main:main.o add.o del.o modify.o
gcc -o $@$^ //$@目标文件完整名称,$^所有依赖文件
.o:.c //.o:.c同等与*.o:*.c,意为所有.c文件变为.o文件
gcc -c $< //$<代表第一个依赖文件,这里.c代表所有.c文件了
clean:
rm *.o //.o在目标文件依赖文件时可以忽略*,clean内部命令仍*.o
rm main
rebuild: clean main
在Makefile中可以定义变量,以便于后续增加变量或删除变量修改
EXEC = main //目标文件名称更改改变这个变量即可
OBJS += main.o
OBJS += add.o
OBJS += del.o
OBJS += modify.o //后续添加参与编译的文件可直接在后面+=
CC = gcc //编译器更改改变这个变量即可
$(EXEC):$(OBJS)
$(CC) -o $@ $^
.o:.c
$(CC) -c $<
clean:
rm -f $(OBJS) //rm -f 删除文件时忽略不存在的文件,这样被删除的文件
不存在也不会报错
rm -f $(EXEC)
rebuild:clean $(EXEC)