零、前言
make
相当于一个集成管理器,用于分析依赖于被依赖关系。在工程管理的时候可以把主动权交给用户,所以程序员一般通过Makefile
文件来管理工程。
比如说,一个成规模的工程项目一般由很多部分组成,一般会将项目分解,因为如此多的文件,仅使用gcc,是非常难办的。但是我们写一个Makefile的话,整体就会变得清晰很多。
比如上图,目标是获得project的3个大功能,每个大功能分为3个小功能,每个小功能由3个file.c实现。如果通过Makefile连接的话,该如何写呢??
一、开始编写
首先新建文件: touch main.c tool1.c tool1.h tool2.c tool2.h
vim * -p
使用gt切换标签页。
第一种写法
那么首先,我们要知道,Makefile中其实是使用的shell语言,可以这样编写:
vim makefile
mytool:main.o tool1.o tool2.o // mytool是即将编译生成的文件
gcc main.o tool1.o tool2.o - o mytool
main.o:main.c
gcc main.c -c -Wall -g -o main.o // 编译main.c生成main.o
tool1.o:tool1.c
gcc tool1.c -c -Wall -g -o tool1.o
tool2.o:tool2.c
gcc tool2.c -c -Wall -g -o tool2.o
clean:
rm *.o mytool -rf
- make
make已是最新
make会自动检查文件的新旧程度,文件最新则不重新进行编译
第二种写法
初版虽然可以运行,但是太长了,过于笨重,而且容易出错;可以使用shell的赋值语句,把gcc替换掉
OBJS=main.o tool1.o tool2.o
CC=gcc
CFLAGS+=-c -Wall -g
mytool:$(OBJS)
$(CC) $(OBJS) -o mytool
main.o
$(CC) main.c $(CFLAGS) main.o
tool1.o:tool1.c
$(CC) tool1.c $(CFLAGS) tool1.o
tool2.o:tool2.c
$(CC) tool2.c $(CFLAGS) tool2.o
clean:
rm *.o mytool -rf
这样的写法虽然看起来规整了不少,但还是太长,不太美观,通过观察,可以发现后三种编译方式看起来类似,那么就可以将其合并。
第三种写法
OBJS=main.o tool1.o tool2.o
CC=gcc
CFLAGS+=-c -Wall -g // 编译选项
mytool:$(OBJS)
$(CC) $^ -o $@ // $^相当于把依赖文件挪过来了
// $@相当于上一句中的目标文件
%.o: %.c
$(CC) $^ $(CFLAGS) -o $@
Clean:
$(RM) *.o mytool
%.o
代表所有以.o
结尾的依赖文件。%.c
代表所有以.c
结尾的依赖文件。
^
表示这一段中的所有依赖文件;@
表示上一句中的目标文件。