Makefile
Makefile语法规则
- 显式表达
目标文件:依赖文件
指令
(第一个目标文件是最终生成的文件) - 伪指令
.PHONY:
指令名:
指令 - 注释使用#
基础用法
现在有一个hello.c源文件,我想生成一个可执行性文件。安装C程序预编译、汇编、编译、链接的过程生成可执行文件hello。步骤如下:
1. 在该目录下创建Makefile文件。文件名为Makefile,无后缀名
2. 编辑Makefile文件
3. 执行make或者make clear
hello:hello.o
gcc hello.o -o hello #注意前面有一个tab键
hello.o:hello.S
gcc -c hello.S -o hello.o
hello.S:hello.i
gcc -S hello.i -o hello.S
hello.i:hello.c
gcc -E hello.c -o hello.i
#伪指令,删除中间文件
.PHONY:
clear:
rm -rf hello.i hello.S hello.o
使用变量
Makefile用三个符号表示变量,分别是=,+=,:=,其中
=表示替换
+=表示追加
:=表示常量
当在Makefile中使用变量时,需要在前面添加$,仍然以前面的例子为例。其Makefile可以更改为
TAR=hello
OBJ=hello.o
CC:=gcc
$(TAR):$(OBJ)
$(CC) $(OBJ) -o $(TAR) #注意前面有一个tab键
hello.o:hello.c
gcc -c hello.c -o hello.o
#伪指令,删除中间文件
.PHONY:
clear:
rm -rf hello.i hello.S hello.o
隐含规则
%.c表示任意的.c文件
%.o表示任意的.o文件
*.c表示所有的.c文件
*.o表示所有的.o文件
假设现在文件夹中有8个文件,分别是1.h,2.h,3.h,1.c,2.c,3.c,main.h和main.c其Makefile文件可以如下:
TAR=main
OBJ=main.o 1.o 2.o 3.o
CC:=gcc
$(TAR):$(OBJ)
$(CC) $(OBJ) -o $(TAR) #注意前面有一个tab键
#
#%.o:%.c
# $(CC) -c %.c -o %.o
#上面注释部分不能被执行,只是为了方便理解,对于任意的.c文件,都生成与之对应的.o文件
#伪指令,删除中间文件
.PHONY:
clear:
rm -rf $(OBJ)
通配符
Makefile支持四种通配符
$@表示所有的目标文件
$^表示所有的依赖文件
$<表示第一个依赖文件
$?表示所有比目标还要新的依赖文件列表
我们可以将上面的Makefile改写为可运行的
TAR=main
OBJ=main.o 1.o 2.o 3.o
CC:=gcc
$(TAR):$(OBJ)
$(CC) $^ -o $@ #注意前面有一个tab键
%.o:%.c
$(CC) -c $^ -o $@
#伪指令,删除中间文件
.PHONY:
clear:
rm -rf $(OBJ)