Makefile是一种编译控制文件,广泛用于项目的自动化构建。它定义了一系列的规则来指导构建的过程。通过Makefile,开发者可以轻松管理大型项目的编译链接、清理等任务。本文将从Makefile的基础用法讲起,逐步深入到更高级的应用,为你呈现一个全面而详细的Makefile使用手册。
第一:Makefile的基本结构
一个最简单的Makefile包含规则,规则由目标(target)、依赖(dependencies)和命令(commands)三部分组成:
target: dependencies commands
命令前的Tab键是必须的。下面是一个简单的示例:
hello: hello.c gcc -o hello hello.c
第二:变量的使用
在Makefile中声明变量可以使得我们的代码更加简洁。
CC=gccCFLAGS=-std=c99LDFLAGS=OBJ=main.o utils.oapp: $(OBJ) $(CC) -o app $(OBJ) $(LDFLAGS)main.o: main.c $(CC) $(CFLAGS) -c main.cutils.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 指定使用其他名称的Makefile文件;
make -j允许并行执行(多核编译)。
第七:高级用法 - 条件判断
Makefile也支持条件判断,这在不同环境需要执行不同命令时非常有用。
ifeq ($(OS),Windows_NT) RM=del /Qelse RM=rm -fendifclean: $(RM) *.o
第八:使用变量和文件包含来组织Makefile
对于大型项目,组织多个Makefile是一种好方法。
# 在子Makefile中include config.mk
第九:自定义函数
通过定义可以重用的函数,你可以使你的Makefile变得更加强大和灵活。
define run-cc$(CC) $(CFLAGS) -o $@ $^endefapp: $(OBJ) $(call run-cc)
第十:处理多目标
定义一个规则来批量处理多个文件。
FILES := file1 file2 file3all: $(FILES)$(FILES): touch $@
第十一:伪目标的使用
伪目标不代表实际的文件,它只是一个动作的名称。
.PHONY: cleanclean: rm -f *.o app
第十二:调试Makefile
你可以使用make --debug或添加注释来帮助调试Makefile。
app: main.o utils.o # 这是一个链接的命令 $(CC) -o app main.o utils.o
结语
Makefile是构建自动化的强大工具,既可以简化小型项目的构建流程,也能够灵活管理大型应用程序的复杂构建系统。通过本文的详细论述和丰富示例,您应该能够基本掌握Makefile的各项技能,并在实际项目中加以应用。
希望以上内容对你深入理解和使用Makefile有所帮助。记住,“实践出真知”——编写你自己的Makefile并尝试使用这些特性是最好的学习方式。
审核编辑 黄宇
-
Linux
+关注
关注
87文章
11030浏览量
207240 -
Makefile
+关注
关注
1文章
124浏览量
19117
发布评论请先 登录
相关推荐
linux系统中常见注册函数的使用方法
![<b class='flag-5'>linux</b><b class='flag-5'>系统</b>中常见注册函数的<b class='flag-5'>使用方法</b>](https://file1.elecfans.com/web2/M00/AA/EC/wKgZomUwhriAOXVRAAA5MhQm5jc042.png)
Makefile for VCS 视频讲解
Linux使用小技巧:嵌入式Linux系统中实现截屏功能的方法和步骤
简单分析linux内核中的结构体使用方法
基于Linux 2.6内核Makefile分析
![基于<b class='flag-5'>Linux</b> 2.6内核<b class='flag-5'>Makefile</b>分析](https://file.elecfans.com/web2/M00/49/C9/pYYBAGKhvF-AaNxuAAAWx5Gmzlo629.jpg)
关于Linux 2.6内核Makefile的分析
Linux内核的Makefile、Kconfig和.config文件
嵌入式Linux中Makefile万能写法
![嵌入式<b class='flag-5'>Linux</b>中<b class='flag-5'>Makefile</b>万能写法](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Linux 下的make 工具和 Makefile
![<b class='flag-5'>Linux</b> 下的make 工具和 <b class='flag-5'>Makefile</b>](https://file1.elecfans.com/web2/M00/8A/05/wKgaomSOtgKAf6E7AACnNNgSlSM852.jpg)
评论