Redian新闻
>
深入浅出 Makefile:从基础到高级应用

深入浅出 Makefile:从基础到高级应用

公众号新闻

转自:网络

Makefile是一种编译控制文件,广泛用于项目的自动化构建。它定义了一系列的规则来指导构建的过程。通过Makefile,开发者可以轻松管理大型项目的编译链接、清理等任务。本文将从Makefile的基础用法讲起,逐步深入到更高级的应用,为你呈现一个全面而详细的Makefile使用手册。

Makefile的基本结构

一个最简单的Makefile包含规则,规则由目标(target)、依赖(dependencies)和命令(commands)三部分组成:

target: dependencies
commands

命令前的Tab键是必须的。下面是一个简单的示例:

hello: hello.c
gcc -o hello hello.c

变量的使用

在Makefile中声明变量可以使得我们的代码更加简洁。

CC=gcc
CFLAGS=-std=c99
LDFLAGS=
OBJ=main.o utils.o

app: $(OBJ)
$(CC) -o app $(OBJ) $(LDFLAGS)

main.o: main.c
$(CC) $(CFLAGS) -c main.c

utils.o: utils.c utils.h
$(CC) $(CFLAGS) -c utils.c

通用规则和模式匹配

模式规则可以减少我们重复相同命令的工作量。

%.o: %.c
$(CC) $(CFLAGS) -c $<

$< 是自动变量之一,代表依赖列表中的第一项。

自动化变量

Makefile提供了一系列自动化变量,它们在规则的命令中非常有用:

  • $@ 表示规则中的目标文件名;

  • $^ 表示所有的依赖文件列表;

  • $< 表示第一个依赖文件;

  • $? 表示所有比目标新的依赖文件列表。

函数的使用

Makefile中内置了许多函数,用以执行字符串操作、文件操作等。

例如,获取源文件列表:

SRC=$(wildcard *.c)
OBJ=$(patsubst %.c,%.o,$(SRC))

控制Make的行为

  • make -B 强制重新编译所有目标;

  • make -n 显示将要执行的命令而不实际执行;

  • make -f <file> 指定使用其他名称的Makefile文件;

  • make -j 允许并行执行(多核编译)。

高级用法 - 条件判断

Makefile也支持条件判断,这在不同环境需要执行不同命令时非常有用。

ifeq ($(OS),Windows_NT)
RM=del /Q
else
RM=rm -f
endif

clean:
$(RM) *.o

使用变量和文件包含来组织Makefile

对于大型项目,组织多个Makefile是一种好方法。

# 在子Makefile中
include config.mk

自定义函数

通过定义可以重用的函数,你可以使你的Makefile变得更加强大和灵活。

define run-cc
$(CC) $(CFLAGS) -o $@ $^
endef

app: $(OBJ)
$(call run-cc)

处理多目标

定义一个规则来批量处理多个文件。

FILES := file1 file2 file3

all: $(FILES)

$(FILES):
touch $@

伪目标的使用

伪目标不代表实际的文件,它只是一个动作的名称。

.PHONY: clean

clean:
rm -f *.o app

调试Makefile

你可以使用make --debug或添加注释来帮助调试Makefile。

app: main.o utils.o
# 这是一个链接的命令
$(CC) -o app main.o utils.o

结语

Makefile是构建自动化的强大工具,既可以简化小型项目的构建流程,也能够灵活管理大型应用程序的复杂构建系统。通过本文的详细论述和丰富示例,您应该能够基本掌握Makefile的各项技能,并在实际项目中加以应用。

希望以上内容对你深入理解和使用Makefile有所帮助。记住,“实践出真知”——编写你自己的Makefile并尝试使用这些特性是最好的学习方式。


推荐阅读  点击标题可跳转

1、零拷贝,性能优化必争之地!

2、20个传感器原理动图【太经典了】

3、ReiserFS 作者在狱中就“被 Linux 内核弃用”发表评论

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
深入详解zookeeper的session管理机制家居修理系列: 漏水篇(1)The ‘Invisible’ Cleaners Keeping the Cities Spotless我编程零基础,但开发了一个自己的 AI 应用 | 极客时间从0基础到哈利波特,我们推出一套英语启蒙的终极解决方案!波士顿租房热门地段自住+投资房源--本周房源精选--Arlington/Lexington/WakefieldNature:2024年最值得关注的七大技术!很可能就是你的创新性研究的基础发烧,出门戴口罩产量达46.27g/L,科学家工程化改造链霉菌合成靛蓝,为工业化应用奠定基础跳绳从0基础到评优加分的秘诀在这,冠军教练亲自授课|开团探讨多模态技术的进展和潜力:下一波引领创新浪潮的杀手级应用|活动报名大模型RAG问答技术架构及核心模块回顾:从Embedding、prompt-embedding到Reranker台湾大选与外省人情结道路结冰黄色预警发布,目前“一黄两蓝”高挂!雨雪冰冻灾害三级应急响应启动权威专家解读:5G融合应用走深向实为6G发展夯实应用基础人工智能≠机器“人”:激活基础模型在产业中的巨大应用潜力和商业价值被清华惊艳到,从KET到高考的4000词汇,全靠它了...LLaVA-MoLE:稀疏混合LoRA专家缓解指令微调MLLM中的数据冲突HCSSA | 哈佛之声校友说: 朱杰伦:从投行banker到医疗行业CFO到连续创业者 – 一个HBS校友的“去金融化”蜕变A Year of Relief for Filmmakers, Theaters — Will It Last?《晴空月儿明》&合唱《约定》Medicare:新移民退休医疗保险深入解析和答疑汇总易点天下:从0到1精益创新-AIGC产品应用及商业化落地实践报告从0基础到哈利波特,英语启蒙陪跑营来啦!美国公校顶配师资从基金小白到高手,还包邮免费送!库克吹捧的 Vision Pro,杀手级应用就这?开发者:我希望它一败涂地小学数学应用题:从常规训练到思维的火花【医学英语】27-3:How Likely Lifestyle Choices Affect Stroke Risk面朝大海,君临城下的魅力城市应急管理部针对这两省启动Ⅳ级应急响应冲击ISEF晋级名额!老查留学4位同学入选英才计划全国终评名单,1位同学入围ISEF四川科学工程大赛!深入浅出LangChain与智能Agent:构建下一代AI助手麻州黄金地段,自住投资两相宜--本周房源精选--Belmont/Wakefield/Lexington我们在 Vision Pro 上,发现了空间计算的杀手级应用麻州黄金地段,自住投资两相宜--本周房源精选--Wakefield/Lexington/Belmont
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。