笔者:YY同学
什么是 Makefile?
Makefile 是一个编译管理文件,可以批量处理多个编译命令。设计者可以通过 Makefile 架构使得源文件按照自己的预期进行编译。在编写好 Makefile 之后只需要使用
make
命令编译即可。
文件结构
首先我们若要生成可执行文件 sum,则需要 main.o 和 sum.o 两个文件,而生成这两个目标代码文件,就需要各自的 .c、.h 编译而成。
代码实例
简易版本:
sum: main.o sum.o
gcc -o sum main.o sum.o
main.o: main.c sum.h
gcc -c main.c
sum.o: sum.c sum.h
gcc -c sum.c
复杂版本:
CPP:=gcc
FLAG=-Wall
DEBUG:=-g
RELEASE:=-O2
OBJ_DIR:=./obj
sinewave: sinewave.o intarray.o
${CPP} ${DEBUG} ${FLAG} -lm $^ -o sinewave
if [ ! -d ${OBJ_DIR} ]; then mkdir ${OBJ_DIR}; fi
mv *.o ${OBJ_DIR}
%.o: %.c
${CPP} ${DEBUG} ${FLAG} ${RELEASE} -c $^
clean:
rm -f *.o
- 目标变量(Target)需要顶格写,后面跟 : 表示需要哪些依赖文件,依赖文件之间用空格隔开。
- 脚本变量后面跟 := 赋值符号。
- 命令部分需要以 \t(Tab 键开头),引用脚本变量时候需要用 ${} 把变量包裹起来。
- -Wall 参数表示开启所有警告报错(Warning All),O2 表示开启二级代码优化。
- $^ 代指 Target 行出现过的每一个依赖文件。因此第 8 行的意思是需要 sinewave.o 和 intarray.o 两个文件进行编译。% 表示文件同名,第 13 行的意思是需要编译所有 .c 源文件并且生成同名的 .o 文件。
- clean 部分一般用于删除中间生成的目标代码(.o),在运行 Makefile 的时候一般会因为找不到依赖目标而不执行,所以需要使用
make clean
命令进行手动删除。