制作Makefile进行项目管理
通过使用Makefile,可以是的项目代码编译管理,节约编译项目时间,做到一次编译,终身受用。
Makefile的工作原理是:
- 分析各个目标和依赖之间的关系。
- 根据一览关系自底向上执行命令
- 根据修改时间比较目标新旧,确定更新
- 如果目标不依赖任何条件,则执行对应命令,以示更新
Makefile的基本规则是:目标、条件、命令。
通过制作各个阶段的Makefile,各个阶段之间从易到难,逐渐提升。
阶段一
all:main.c add.c sub.c
gcc main.c add.c sub.c -o app
all表示执行命令后达成了all目标,也可以写成app,依赖条件是:main.c add.c sub.c,命令是:gcc main.c add.c sub.c -o app
保存之后,直接运行make命令
此版本当修改一个文件时,所有的文件都要重新编译,当项目比较大时,没有起到节约时间的作用。
阶段二
app:main.o add.o sub.o
gcc main.o add.o sub.o -o app
main.o:main.c
gcc -c main.c
add.o:add.c
gcc -c add.c
sub.o:sub.c
gcc -c sub.c
clean:
rm *.o
rm app
clean : 清除编译生成的中间.o文件和最终目标文件。
由于make默认执行第一个目标,clean与前面的没有关系,所以如果要执行clean,则要使用make clean。
如果当前目录下有同名clean文件,则不执行clean对应的命令:
- 伪目标声明:.PHONY:clean
clean命令中的特殊符号:
“-”此条命令出错,make也会继续执行后续的命令。如:“-rm main.o”
“@”不显示命令本身,只显示结果。如:“@echo”clean done“”
app:main.o add.o sub.o
gcc main.o add.o sub.o -o app
main.o:main.c
gcc -c main.c
add.o:add.c
gcc -c add.c
sub.o:sub.c
gcc -c sub.c
.PHONY:clean
clean:
-@rm *.o
-@rm app
此时的Makefile文件可以做到节约时间的作用。不过,可以根据Makefile定义一些变量,使得代码通用性更强。
阶段三
obj=main.o add.o sub.o
app:$(obj)
gcc $(obj) -o app
main.o:main.c
gcc -c main.c
add.o:add.c
gcc -c add.c
sub.o:sub.c
gcc -c sub.c
.PHONY:clean
clean:
-@rm *.o
-@rm app
@表示目标, ^表示所有的依赖,$<表示依赖中的第一个。
obj=main.o add.o sub.o
app:$(obj)
gcc $(obj) -o app
%.o:%.c
gcc -c $^ -o $@
.PHONY:clean
clean:
-@rm *.o
-@rm app
阶段四
为了是的Makefile更加通用,使用Makefile的一些函数。
- wildcard 查找符合条件的文件名
- patsubst 查找替换
1 src = $(wildcard *.c)
2 obj = $(patsubst %.c,%.o,$(src))
3 target = app
4
5 $(target):$(obj)
6 gcc $^ -o $@
7
8 %.o:%.c
9 gcc -c $^ -o $@
10
11 clean:
12 -@rm *.o
13 -@rm app
阶段五
CPPFLAGS = -Iinclude
CFLAGS = -g -Wall
LDFLAGS = -L../lib -lmycalc
CC = gcc
src = $(wildcard *.c)
obj = $(patsubst %.c,%.o,$(src))
target = app
$(target):$(obj)
$(CC) $^ $(LDFLAGS) -o $@
%.o:%.c
$(CC) -c $^ $(CFLAGS) $(CPPFLAGS) -o $@
clean:
-@rm *.o
-@rm app