news 2026/9/6 2:52:39

Makefile文件---构建规则

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Makefile文件---构建规则

0 Preface/Foreword

1 构建规则

构建规则中的三要素

  • 目标:target
  • 依赖:dependancies / prerequisites
  • 命令:commands

三要素的关系可以简单归纳为:为了生成目标🎯,需要哪些依赖文件,并通过执行什么命令来完成。

1.1 三要素的定义和角色

1.1.1 目标

目标相关描述如下

  • 定义:要生成的最终产物或中间产物。
  • 形式:通常是一个文件名(可以是可执行文件main、目标文件main.o),也可以是一个动作标签(比如:clean、install,称为伪目标.PHONY)
  • 角色:目标是构建过程的输出。

1.1.2 依赖

依赖相关描述如下

  • 定义:生成目标所必须的文件或另一个目标。
  • 形式:源文件(*.c, *.cpp)、头文件(*.h)、库文件或者其他已生成的目标文件(*.o)。
  • 角色:作为构建过程的输入。如果依赖文件目标文件新(依赖被修改过),或者目标文件不存在,Make就会认为目标“过期”,需要重新构建。

1.1.3 命令

命令相关描述如下

  • 定义:将依赖转换为目标的具体操作步骤。
  • 形式:shell命令,比如gcc -c main.c、 rf -f *.o .
  • 关键语法要求:命令行的开头必须使用Tab键缩进,不能使用空格,否则Make会报错。

1.2 三要素之间的逻辑关系

Makefile的规则本质上是描述一个自动化构建流程,逻辑如下:

  1. 触发条件:Make工具检查目标文件是否存在,以及依赖文件的最后修改时间是否晚于目标文件。
  2. 执行判断
    • 目标不存在;
    • 任意一个依赖文件比目标文件都更新(文件修改时间);
    • 目标是伪目标(Phony Target)
  3. 结果:命令执行完成后,生成或更新目标文件。

1.3 注意事项

注意事项如下

  • Tab键强制要求:不能用空格替代,否则会造成make工具读取makefile文件时候,解析失败。
  • 依赖的完整性:假设main.c中包含了utils.h,那么main.o的依赖需要写成main.o : main.c utils.h。否则,修改头文件时make不会重新编译对应的源文件,导致构建错误。
  • 伪目标(.PHONY):例如clean这样的目标并不会对应实际文件,如果不申明为伪目标(.PHONY: clean),并且路径下有一个名为clean的文件,make会认为目标已是最新而拒绝执行删除命令。所以,建议始终使用.PHONY声明非文件类目标。

1.3.1 伪目标

通过.PHONY进行设定的目标。

1.4 自动变量

为了简化Makefile的编写,Make提供了自动变量:

  • $@:代表当前规则的目标🎯。
  • $^:代表当前规则的所有依赖。
  • $<:代表当前规则的第一个依赖。

1.5 构建三要素组合规则

作为一个构建规则中的三要素,不同场景会出现不同的组合方式,不是所有场景三要素都必须存在,具体情况如下面表格所示:

组合情况是否合法典型应用注意事项
目标+依赖+命令是✅️标准构建规则NULL
目标+命令是✅️伪目标(all, clean, install)若非伪目标文件存在,命令不会执行
目标+依赖是✅️依赖聚合、阻止隐含规则(impicit rule)仅触发依赖检查,不执行shell命令
目标是✅️占位符、配合隐含规则(placeholder、coordinate)若无隐含规则且文件不存在,会报错
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/31 18:29:54

Grok Imagine Image 2.0 落地指南:从文生图到对话式图像生成

开头如果你最近在关注 AI 图像生成方向&#xff0c;应该能感受到一个明显的变化&#xff1a;讨论的焦点正在从“哪家模型生成的图更漂亮”转向“我能不能和模型在一个上下文里把图改成我真正想要的样子”。过去我们用文生图工具&#xff0c;基本是“输入一段提示词&#xff0c;…

作者头像 李华
网站建设 2026/8/31 13:47:08

STM32U599:图形与功耗兼得的超低功耗MCU方案

拿到23年STM32峰会资料序列里那几篇U5系列的PPT时&#xff0c;我第一反应是&#xff1a;ST终于把“图形显示”和“超低功耗”这两件在MCU产品里天然有点拧巴的事&#xff0c;放到同一颗芯片上认真解决了。STM32U599这个名字&#xff0c;在超低功耗圈子里不算陌生&#xff0c;但…

作者头像 李华
网站建设 2026/8/31 13:09:13

基于SpringBoot的首饰品商城小程序设计与实现毕业设计项目源码文档

温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台…

作者头像 李华
网站建设 2026/8/31 19:30:36

阿里系统工程师笔试题解析:从Linux到生产架构设计

1. 一场笔试题背后的岗位画像&#xff1a;系统工程师到底在考什么 先说背景。2015年阿里的系统工程师研发笔试题&#xff0c;在当时的求职论坛里流传很广&#xff0c;原因不在于题目有多难&#xff0c;而在于它非常“奇怪”——整套卷子既不完全是开发题&#xff0c;也不完全是…

作者头像 李华
网站建设 2026/9/1 17:54:38

uniapp工业级重机械维修APP架构与实战

简介&#xff1a;本资源是一套基于uniapp开发的重机械维修服务类APP完整源码&#xff0c;面向前端开发者及跨平台移动应用学习者&#xff0c;聚焦设备报修与保养业务流程的数字化闭环实现。系统以用户端为核心&#xff0c;涵盖设备绑定、工单提交&#xff08;含定位与信息填充&…

作者头像 李华
网站建设 2026/9/1 14:09:22

iOS面试备考核心指南:从Runtime到RunLoop的原理与实战场景

先说明一下&#xff0c;这个栏目我确实持续在更新。市面上讲iOS面试题的资料很多&#xff0c;但大多是一份题单甩给你&#xff0c;背完照样挂。原因很简单&#xff1a;面试官早就不满足于听你背概念了&#xff0c;他们要的是"你能在什么场景下用出这个知识点"的证据。…

作者头像 李华