Makefile
快速到达Makefile介绍Makefile核心语法基本规则Makefile执行过程Makefile中的变量常用变量惯例Makefile中的变量三种变量类型对比Makefile中的函数wildcard函数获取匹配的文件列表patsubst函数模式替换函数Makefile介绍Makefile 是一个用于自动化构建和管理项目的文本文件由目标target、依赖prerequisites、命令commands构成这些元素共同组成“规则”make 工具负责读取并解析 Makefile 文件按照其中定义的规则执行项目构建操作作用自动化编译通过检测文件修改时间戳仅重新编译发生变化的文件及其依赖文件避免重复编译未改动部分提升编译效率依赖管理清晰定义文件间的依赖关系明确源文件、头文件和目标文件等之间的关联确保项目构建顺序正确流程规范统一项目的构建命令和流程使得项目构建过程标准化便于团队协作开发和项目维护需要Makefile原因手动输入编译命令不仅繁琐复杂容易出错而且当项目规模扩大源文件和头文件数量增多时手动管理编译程序和依赖关系会耗费大量时间和精力。而Makefile能够只能判断文件变化实现增量编译极大提高编译效率规范项目管理流程是项目构建更加有序。Makefile 与 make 工具的关系make 工具作为解释器读取和解析 Makefile 文件中的规则它根据文件的时间戳判断是否需要重新编译从而实现自动化构建。Makefile 则是定义项目构建规则和流程的脚本两者紧密配合完成项目的自动化构建任务。使用场景多文件项目开发当项目包含多个源文件.c、.cpp等、头文件.h和库文件时手动编译繁琐易错Makefile可通过依赖关系自动管理编译程序增量编译需求仅重新编译修改过的文件及其依赖文件大幅减少编译时间。跨平台构建通过条件判断适配不同操作系统的编译选项、头文件路径和链接库实现跨平台项目的统一构建复杂项目分层管理支持递归构建子目录如内核模块、第三方库配合伪目标实现统一的构建make all和清理make clean操作方便管理复杂项目的各个模块。Makefile核心语法基本规则格式目标(target):依赖(prerequisites)必须按下tab键命令(commands)说明目标可以是要生成的文件如可执行文件 app 或目标文件 main.o也可以是伪目标如clean伪目标不是真实的文件用于执行特定的操作如清理生成的文件声明伪目标时需通过 .PHONY 关键字显式标记避免因同名文件存在而导致目标失效依赖生成目标所需的文件列表可以是源文件、头文件或其他目标。目标的更新依赖于依赖文件的变化即当依赖文件的修改时间比目标文件新时目标需要重新生成命令生成目标的具体操作如编译命令gcc -c main.c每条命令单独一行且必须以 Tab 键缩进(不能用空格代替),在命令前添加 符号可禁止命令本身的回显仅显示执行结果用于提升输出可读性示例app:main.o utis.ogcc -o app main.o utis.o执行逻辑make 工具通过比较目标与依赖文件的修改时间戳仅当依赖文件比目标 “更新” 时才执行命令重新生成目标实现增量构建。例如如果 main.o 和 utils.o 的修改时间都比 app 旧那么 make工具不会执行链接命令若其中一个或两个依赖文件被修改app 将被重新链接生成。Makefile执行过程Makefile中的变量本质字符串用于存储编译器、编译选项、文件名等信息变量引用$(变量名)小括号不可丢定义方式 延迟赋值当使用此变量时才会对变量进行赋值操作格式变量名 变量的初始值:立即赋值定义时直接展开不支持引用未定义变量格式变量名 : 变量的初始值追加赋值在原有值后添加新字符串用空格分隔格式变量名 变量的初始值?条件赋值判断变量是否有初始值如果有值就不赋值如果没有初始值才会进行赋值的操作格式变量名 ? 变量的初始值常用变量惯例在Makefile中会将一些常用变量定义为大写例变量名说明CC指定C 编译器通常默认值为gcc可重赋值为其他C 编译器路径或名称CFLAGS用于指定C 编译器的编译选项如-Wall开启所有警告、-g生成调试信息等CPPFLAGSC 预处理器的选项例如包含头文件的路径等CXX指定C 编译器默认可能是g同样可修改为其他C 编译器CXXFLAGSC 编译器的编译选项与CFLAGS类似针对C 代码编译OBJS通常用于表示目标文件列表是由源文件编译生成的中间文件LDFLAGS链接器的选项例如指定库文件路径、链接特定的库等LIBS需要链接的库文件列表如-lm链接数学库、-lpthread链接线程库等AR归档器用于创建和维护静态库通常为arARFLAGS归档器的选项用于指定创建静态库的相关参数RM用于指定删除文件的命令通常默认值为rm -f-f选项表示强制删除不提示确认Makefile中的变量变量的类型自定义变量由用户自行定义可灵活设置和修改用于存储项目中的各类信息像源文件路径、目标文件路径、编译选项、链接选项等。在实际使用中通过常见的赋值方式、:、、? 来确定变量值。例如CC : gcc将编译器指定为gcc预定义变量是 Make 工具自身携带的变量具备默认值像CC通常默认指向gcc用于指定 C 编译器用户可以根据实际项目的要求对这些预定义变量进行覆盖以调整构建过程自动化变量(局部变量)在规则的命令中会依据上下文自动获取相应的值$代表当前目标对应的字符串即正在生成的目标文件的名称$^表示所有依赖对应的字符串即依赖的所有文件的列表(会自动去除重复的依赖文件)$指第一个依赖对应的字符串即当前目标的第一个依赖文件三种变量类型对比变量类型定义来源赋值特点作用域典型应用场景自定义变量用户自行定义可通过延迟赋值、:立即赋值、追加赋值、?条件赋值确定值灵活性高全局在Makefile文件中都可访问用于存储项目中自定义信息如源文件路径、自定义编译选项等预定义变量Make工具自带有默认值用户可按需覆盖默认值来调整构建过程全局涉及Make 工具默认行为的设置如指定编译器、链接器等自动化变量无特定用户定义在规则命令中起作用在规则的命令中依据上下文自动获取值仅在当前规则命令内有效仅在规则的命令中有效在规则命令中处理目标文件和依赖文件相关操作如编译、链接Makefile中的函数wildcard函数获取匹配的文件列表功能在当前目录及其子目录中按指定模式“PATTERN”查找并列出所有符合格式的文件名模式“PATTERN”采用 shell 通配符如“*”匹配多个字符等等语法$(wildcard PATTERN)其中PATTERN为文件匹配模式字符串例$(wildcard *.c)返回当前目录下所有.c源文件列表$(wildcard include/*.h)返回include目录下所以.h头文件列表返回值以空格分隔的符合模式 “PATTERN”的文件名列表无匹配文件时返回空字符串应用场景自动收集源文件自动发现目录下的所有源文件避免手动维护文件列表提高项目可扩展性查找条件构建逻辑根据文件是否存在决定构建行为实现灵活的条件编译等等注意事项仅匹配实际存在的文件wildcard 只返回文件系统中真实存在的文件路径无匹配文件时返回空值通配符路径精确性需明确指定搜索目录避免意外匹配其他路径变量与函数结合时需确保变量值正确使用$(info text)打印变量值验证匹配结果patsubst函数模式替换函数功能对指定字符串TEXT中的单词进行模式匹配替换将符合模式PATTERN的部分替换为指定的替换模板REPLACEMENT模式中的“%”代表任意字符序列替换模板中的 “%”会被自动替换为模式中 “%”所匹配的内容语法$(patsubst PATTERN,REPLACEMENT,TEXT)PATTERN包含“%”的匹配模式如%.cREPLACEMENT替换模板如%.oTEXT待处理的字符串通常为文件名列表例$(patsubst %.c,%.o,main.cfunc.c)将字符串 main.c func.c 里所有符合 %.c 模式的单词替换成以 .o 结尾的形式返回值替换后的新字符串原字符串中不符合模式的部分保持不变。若无可匹配项则返回原字符串应用场景源文件与目标文件自动映射将 .c 文件列表转换为 .o 目标文件列表避免手动维护重复的文件名批量修改文件路径或扩展名如将src/目录下的文件映射到build/目录等等注意事项“%”仅匹配完整单词模式替换基于空格分隔的单词而非字符串片段模式与替换模板需严格对应替换模板中的 % 必须与模式中的 % 对应相同内容字面量“%”的转义若需在模式或替换模板中使用字面量%需用 \% 转义

相关新闻

20260227_141609_一口气给你讲清楚黑客最常用的6种入侵方式!

20260227_141609_一口气给你讲清楚黑客最常用的6种入侵方式!

一口气给你讲清楚黑客最常用的6种入侵方式! 一、黑客常用的入侵方式 黑客常用的渗透方法大体可以分为6类:获取口令入侵、远程控制入侵、木马入侵、系统漏洞入侵、电子邮件入侵、网络监听入侵等。 1.获取口令入侵 顾名思义,就是获取到管理员…

2026/5/17 7:00:52 阅读更多 →
go除了rpc作为公共服务外,有没有可能其它方式

go除了rpc作为公共服务外,有没有可能其它方式

Go 语言除了 RPC(如 gRPC、Thrift 等)之外,确实有多种方式可以作为公共服务对外提供。以下是几种常见的方式:1. RESTful API (HTTP/JSON)最传统和广泛使用的方式,使用标准库 net/http 或框架(Gin、Echo、Fi…

2026/7/5 17:43:21 阅读更多 →
调用 dp123电天下平台 “获取电天下列表详情数据” API 接口指南

调用 dp123电天下平台 “获取电天下列表详情数据” API 接口指南

接口概述dp123电天下平台 提供了 获取电天下列表详情数据 的 API 接口。该接口主要用于查询平台上的电天下相关数据列表及其详情信息。开发者可以通过此接口获取结构化数据,用于数据分析、可视化展示或与其他系统集成。接口基本信息请求方式: GET接口地址…

2026/7/6 9:13:46 阅读更多 →

最新新闻

华硕笔记本性能控制革命:G-Helper轻量级工具完全指南

华硕笔记本性能控制革命:G-Helper轻量级工具完全指南

华硕笔记本性能控制革命:G-Helper轻量级工具完全指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Exp…

2026/7/7 14:46:59 阅读更多 →
allure的安装及配置

allure的安装及配置

allure是一款轻量级并且非常灵活的开源 测试报告框架。 它支持绝大多数测试框架,它简单易用,易于集成。 一、allure的下载 -下载网址(allure官网):Allure Report — Open-source HTML test automation report tool …

2026/7/7 14:44:58 阅读更多 →
MAX9744与TM4C123GH6PZ音频系统设计与优化

MAX9744与TM4C123GH6PZ音频系统设计与优化

1. 为什么选择MAX9744和TM4C123GH6PZ组合 在音频功率增强方案中,MAX9744 D类音频功率放大器与TM4C123GH6PZ微控制器的组合堪称黄金搭档。这套方案特别适合需要兼顾高音质和小型化的应用场景,比如便携式音响系统、车载音频升级、智能家居中控等。 MAX974…

2026/7/7 14:42:58 阅读更多 →
13DOF传感器与PIC18F97J94实现高精度定位导航方案

13DOF传感器与PIC18F97J94实现高精度定位导航方案

1. 项目背景与核心需求在嵌入式系统开发领域,精确的定位与导航能力正成为各类智能设备的基础需求。传统GPS定位在室内或复杂环境中往往表现不佳,而单纯依赖惯性测量单元(IMU)又存在累积误差问题。这正是13DOF传感器与PIC18F97J94微控制器组合方案的价值所…

2026/7/7 14:42:58 阅读更多 →
写一个自己的操作系统,用哪台手机?

写一个自己的操作系统,用哪台手机?

为裸机 OS 开发,该买哪台手机当目标机做裸机 OS 目标机的手机选择(2025–2026)靳若琦 Ruoqi Jin(独立研究员) 选题整理 本文为 AI 聚合搜索调研报告太长不看拿来做首发 bring-up 的主力机,建议直接在二手市…

2026/7/7 14:42:58 阅读更多 →
3步轻松搞定系统启动盘:Balena Etcher完整使用指南

3步轻松搞定系统启动盘:Balena Etcher完整使用指南

3步轻松搞定系统启动盘:Balena Etcher完整使用指南 【免费下载链接】etcher Flash OS images to SD cards & USB drives, safely and easily. 项目地址: https://gitcode.com/GitHub_Trending/et/etcher 你是否曾因制作系统启动盘而感到困惑?…

2026/7/7 14:38:57 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻