嵌入式学习之Makefile

概念

1.Makefile是一个工程管理工具,本质上就是一个文件,文件中存放的是代码编译规则
2.Makefile会根据文件的时间戳(文件修改的时间)来决定工程内的文件是否需要重新编译。大大提高编译效率
3.Makefile 是一种构建自动化工具的文件,用于管理和自动化软件构建过程。

格式

  1. 在指定的目录下创建一个名字为:Makefile 或者 makefile的文件
  2. 若同一目录下需要多个makefile文件 ,可以给makefile分别取名叫:makefile1 makefile2,
    在这里插入图片描述
    1. 终端输入make,默认执行Makefile文件。若提示没有make指令,则用下列命令安装
      sudo apt-get install make
    1. 指定执行某个makefile文件 ----》 make -f makefile1
      make 指令,例如—》 make clean —》则会默认执行Makefile文件中clean指令下面的命令
    1. @:取消回显 --》指令执行过程不在终端显示
      在这里插入图片描述
    1. 变量引用:makefile中的变量与shell脚本一致,不需要定义,也没有数据类型的说法。$(变量名)
    1. “=” 最终赋值
      会将变量在makefile中的所有赋值都完成后,将最后一次的赋值当做结果赋值给变量。
      ":="立即赋值在这里插入图片描述
      "+="追加赋值
      在这里插入图片描述
      “?=” 询问赋值
      如果变量为空,则赋值,如果变量中有数据了,就不赋值

简化Makefile

  1. 通过变量赋值进行简化
# 定义对象文件变量 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)

  1. 用特殊符号简化
    $@ 目标文件
    $^ 所有依赖文件
    $< 第一个依赖文件
# 定义目标文件的变量
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)

  1. 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)

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值