linux系统中Makefile的使用方法

描述

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并尝试使用这些特性是最好的学习方式。

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分