Linux系统编程-Makefile

本文介绍Makefile的基础概念、语法规则及其工作原理,并通过实例详细展示了如何利用Makefile简化大型项目的编译流程,减少重复编译时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Makefile简介

  • makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译。

  • make是一个命令工具,是一个解释makefile中指令的命令工具

make主要解决两个问题
1)大量代码的关系维护

  • 大项目中源代码比较多,手工维护、编译时间长而且编译命令复杂,
  • 把代码维护命令及编译命令写在makefile文件中,然后再用make工具解析此文件自动执行相应命令,可实现代码的合理编译

2) 减少重复编译时间

  • 在改动其中一个文件的时候,能判断哪些文件被修改过,可以只对该文件进行重新编译,然后重新链接所有的目标文件,节省编译时间

Makefile语法规则

目标:依赖文件列表

命令列表

目标:通常是要产生的文件名称,目标可以是可执行文件或其它obj文件,也可是一个动作的名称
依赖文件:用来输入从而产生目标的文件,一个目标通常有几个依赖文件(可以没有)
命令:make执行的动作,一个规则可以含几个命令(可以没有),有多个命令时,每个命令占一行

Makefile工作原理

1)若想生成目标, 检查规则中的依赖条件是否存在,如不存在,则寻找是否有规则用来 生成该依赖文件
在这里插入图片描述
2) 检查规则中的目标是否需要更新,必须先检查它的所有依赖,依赖中有任一个被更新,则目标必须更新
在这里插入图片描述

Makefile示例

1)最简单的Makefile

目标:依赖文件列表
命令列表
test:test.c add.c sub.c mul.c div.c
    gcc test.c add.c sub.c mul.c div.c -o test
test:test.o add.o sub.o mul.o div.o
    gcc test.o add.o sub.o mul.o div.o -o test
​
test.o:test.c
    gcc -c test.c
add.o:add.c
    gcc -c add.c
sub.o:sub.c
    gcc -c sub.c
mul.o:mul.c
    gcc -c mul.c
div.o:div.c
    gcc -c div.c

Makefile中的变量

自定义变量

1)定义变量方法:
变量名=变量值
2)引用变量:
( 变量名 ) 或 (变量名)或 (变量名){变量名}

#变量
OBJS=add.o sub.o mul.o div.o test.o
TARGET=test
​
$(TARGET):$(OBJS)
    gcc $(OBJS) -o $(TARGET) 
​
add.o:add.c
    gcc -c add.c -o add.o
​
sub.o:sub.c
    gcc -c sub.c -o sub.o
​
mul.o:mul.c
    gcc -c mul.c -o mul.o
​
div.o:div.c
    gcc -c div.c -o div.o
​
test.o:test.c
    gcc -c test.c -o test.o
​
clean:
    rm -rf $(OBJS) $(TARGET)

makefile中也提供了一些变量(变量名大写)供用户直接使用,我们可以直接对其进行赋值。

CC = gcc #arm-linux-gcc
CPPFLAGS : C预处理的选项 如:-I
CFLAGS: C编译器的选项 -Wall -g -c
LDFLAGS : 链接器选项 -L -l

$@: 表示规则中的目标
$<: 表示规则中的第一个条件
$^: 表示规则中的所有条件, 组成一个列表, 以空格隔开,如果这个列表中有重复的项则消除重复项。
#变量
OBJS=add.o sub.o mul.o div.o test.o add.o
TARGET=test
CC=gcc
​
#$@: 表示目标
#$<: 表示第一个依赖
#$^: 表示所有的依赖$(TARGET):$(OBJS)
    #$(CC) $(OBJS) -o $(TARGET) 
    $(CC) $^ -o $@
    echo $@
    echo $<
    echo $^
​
add.o:add.c
    $(CC) -c $< -o $@ 
​
sub.o:sub.c
    $(CC) -c $< -o $@ 
​
mul.o:mul.c
    $(CC) -c $< -o $@ 
​
div.o:div.c
    $(CC) -c $< -o $@ 
​
test.o:test.c
    $(CC) -c $< -o $@
​
clean:
    rm -rf $(OBJS) $(TARGET)

模式规则

%.o:%.c

$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@

OBJS=test.o add.o sub.o mul.o div.o
TARGET=test
$(TARGET):$(OBJS)
    gcc $(OBJS) -o $(TARGET) 
​
%.o:%.c
    gcc -c $< -o $@

Makefile中的函数

wildcard – 查找指定目录下的指定类型的文件
src = $(wildcard *.c) //找到当前目录下所有后缀为.c的文件,赋值给src

patsubst – 匹配替换
obj = $(patsubst %.c,%.o, $(src)) //把src变量里所有后缀为.c的文件替换成.o
SRC=$(wildcard *.c)
OBJS=$(patsubst %.c, %.o, $(SRC))
TARGET=test
$(TARGET):$(OBJS)
    gcc $(OBJS) -o $(TARGET) 
​
%.o:%.c
    gcc -c $< -o $@

Makefile中的伪目标

clean用途: 清除编译生成的中间.o文件和最终目标文件

SRC=$(wildcard *.c)
OBJS=$(patsubst %.c, %.o, $(SRC))
TARGET=test
$(TARGET):$(OBJS)
    gcc $(OBJS) -o $(TARGET) 
​
%.o:%.c
    gcc -c $< -o $@
.PHONY:clean	//伪目标声明
clean:
    rm -rf $(OBJS) $(TARGET)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值