概念
1.Makefile是一个工程管理工具,本质上就是一个文件,文件中存放的是代码编译规则
2.Makefile会根据文件的时间戳(文件修改的时间)来决定工程内的文件是否需要重新编译。大大提高编译效率
3.Makefile 是一种构建自动化工具的文件,用于管理和自动化软件构建过程。
格式
- 在指定的目录下创建一个名字为:Makefile 或者 makefile的文件
- 若同一目录下需要多个makefile文件 ,可以给makefile分别取名叫:makefile1 makefile2,
-
- 终端输入make,默认执行Makefile文件。若提示没有make指令,则用下列命令安装
sudo apt-get install make
- 终端输入make,默认执行Makefile文件。若提示没有make指令,则用下列命令安装
-
- 指定执行某个makefile文件 ----》 make -f makefile1
make 指令,例如—》 make clean —》则会默认执行Makefile文件中clean指令下面的命令
- 指定执行某个makefile文件 ----》 make -f makefile1
-
- @:取消回显 --》指令执行过程不在终端显示
- @:取消回显 --》指令执行过程不在终端显示
-
- 变量引用:makefile中的变量与shell脚本一致,不需要定义,也没有数据类型的说法。$(变量名)
-
- “=” 最终赋值
会将变量在makefile中的所有赋值都完成后,将最后一次的赋值当做结果赋值给变量。
":="立即赋值
"+="追加赋值
“?=” 询问赋值
如果变量为空,则赋值,如果变量中有数据了,就不赋值
- “=” 最终赋值
简化Makefile
- 通过变量赋值进行简化
# 定义对象文件变量 Obj
Obj := 06_union.o 07_func.o # Obj 变量包含 06_union.o 和 07_func.o 两个对象文件
# 定义目标文件变量 Target
Target := a.out # Target 变量表示最终生成的可执行文件 a.out
# 定义编译器变量 CC
CC := gcc # CC 变量定义为 gcc 编译器
# 定义编译选项变量 CAN
CAN := -c -o # CAN 变量表示编译选项,用于生成目标文件
# 规则:生成最终可执行文件
$(Target): $(Obj) # 目标 a.out 依赖于所有对象文件 $(Obj)
$(CC) $(Obj) -o $(Target) # 使用 gcc 编译器将所有对象文件链接生成 a.out
# 规则:生成 06_union.o 对象文件
06_union.o: 06_union.c # 目标 06_union.o 依赖于源文件 06_union.c
$(CC) 06_union.c $(CAN) 06_union.o # 使用 gcc 编译器将 06_union.c 编译成 06_union.o
# 规则:生成 07_func.o 对象文件
07_func.o: 07_func.c # 目标 07_func.o 依赖于源文件 07_func.c
$(CC) 07_func.c $(CAN) 07_func.o # 使用 gcc 编译器将 07_func.c 编译成 07_func.o
# 伪目标:clean,用于清理生成文件
.PHONY: clean # 定义伪目标 clean,不会生成与其同名的文件
clean: # clean 目标,用于删除生成的对象文件和可执行文件
rm $(Obj) $(Target) # 删除对象文件 $(Obj) 和最终生成的可执行文件 $(Target)
- 用特殊符号简化
$@ 目标文件
$^ 所有依赖文件
$< 第一个依赖文件
# 定义目标文件的变量
obj := union.o func.o
# 定义最终生成的可执行文件的名称
Target := a.out
# 指定编译器为gcc
CC := gcc
# 指定编译选项 -c 表示只编译,不进行链接
CFLAGS := -c
# 规则:生成可执行文件
# $@ 表示目标文件,这里是 $(Target)
# $^ 表示所有的依赖文件,这里是 $(obj)
$(Target): $(obj)
$(CC) -o $@ $^
# 规则:生成 union.o 文件
# union.o 依赖 union.c 和 func.h
# $< 表示第一个依赖文件,这里是 union.c
union.o: union.c func.h
$(CC) $(CFLAGS) union.c
# 规则:生成 func.o 文件
# func.o 依赖 func.c 和 func.h
# $< 表示第一个依赖文件,这里是 func.c
func.o: func.c func.h
$(CC) $(CFLAGS) func.c
# 规则:清理生成的文件
# rm -f 强制删除目标文件 $(obj) 和 $(Target)
clean:
rm -f $(obj) $(Target)
- Makefile最终版
# 定义变量
obj := union.o func.o # 目标文件列表,包含 union.o 和 func.o
Target := a.out # 最终生成的可执行文件名称
CC := gcc # 使用 gcc 作为编译器
CFLAGS := -c # 编译选项,-c 表示只编译,不进行链接
# 生成可执行文件的规则
# $(Target): $(obj) 表示生成 $(Target) 需要依赖 $(obj)
# $@ 表示目标文件,这里是 $(Target)
# $^ 表示所有的依赖文件,这里是 $(obj)
$(Target): $(obj)
$(CC) -o $@ $^
# 生成 union.o 的规则
# union.o 依赖 union.c 和 func.h
# $< 表示第一个依赖文件,这里是 union.c
union.o: union.c func.h
$(CC) $(CFLAGS) $<
# 生成 func.o 的规则
# func.o 依赖 func.c 和 func.h
# $< 表示第一个依赖文件,这里是 func.c
func.o: func.c func.h
$(CC) $(CFLAGS) $<
# 清理生成的文件
# clean 是一个伪目标,不生成文件,只执行命令
# rm -f 强制删除 $(obj) 和 $(Target)
clean:
rm -f $(obj) $(Target)