【Linux】一步一步教你编写单目录和多目录Makefile

目录

一、什么是make和Makefile?

二、Makefile的组成、优点和原理

1.Makefile组成

2.Makefile优点

3.Makefile原理

三、单目录编写Makefile

1.第一阶段Makefile文件

2.第二阶段Makefile文件

3.第三阶段Makefile文件

 4.第四阶段Makefile文件

5.第五阶段Makefile文件

四、多目录编写Makefile

一、什么是make和Makefile?

当我们写大型项目时源文件很多,手动编译复杂且效率慢,而Makefile可实现自动化编译,可以很好的解决这个问题;

Makefile一旦写完,只需要 make 命令,整个工程全完自动化编译;make命令是GNU的工程化编译工具,它用于编译大量互相关联的源代码,使用它可以实现项目的工程化管理;

Makefile的作用就是执行make命令的时候指定编译和链接的规则;

二、Makefile的组成、优点和原理

1.Makefile组成

Makefile组成三要素:目标,依赖, 命令;

  • 目标:要生产的目标文件
  • 依赖:用来产生目标的输入文件
  • 命令:生成文件的过程

文件格式

目标文件:依赖文件

[Tab键]命令

2.Makefile优点

(1)减少重复编译的时间

每次只会编译修改的和依赖于修改的那些文件,减少了重复编译的时间,提高了编译效率

(2)更好的进行代码维护

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

3.Makefile原理

(1)目标的生成

检查规则中的依赖是否存在,若依赖文件不存在,则寻找是否有规则生成依赖文件

(2)目标的更新

检查目标的所有依赖,任意一个有更新就重新生产目标文件

三、单目录编写Makefile

touch创建makefile文件再vim编写,或直接vim打开

1.第一阶段Makefile文件

不够通用,如果第一行的依赖文件改变,后面的都需要改变

2.第二阶段Makefile文件

这里的引用变量有点类似于宏替换,别名的意思;引入变量代替这些.o文件,只需要在用到这些.o文件的地方更改为新的$(变量名)

3.第三阶段Makefile文件

自动推导

 4.第四阶段Makefile文件

可实现自动添加所有变量

  •  > $@  : 目标文件 
  •  $^   : 所有依赖文件 
  •  $<   : 第一个依赖文件

 

5.第五阶段Makefile文件

自动查找文件下所有文件名,不需要手动输入.o文件

  • wildcard函数查找文件下所有文件名
  • patsubst查找替换

SRCS := $(wildcard *.c)
OBJS := $(patsubst %.c,%.o,$(SRCS))
CC = gcc
TARGETS = main
$(TARGETS):$(OBJS)
        $(CC) $^ -o $@
%.o:%.c
        $(CC) -c $<
clean:
        rm -f *.o $@

四、多目录编写Makefile

文件工程目录:

DIR_INC = ./include
DIR_SRC = ./src
DIR_OBJ = ./obj
DIR_BIN = ./bin

SRC = $(wildcard ${DIR_SRC}/*.c)
OBJ = $(patsubst %.c,${DIR_OBJ}/%.o,$(notdir ${SRC}))

TARGET = main

BIN_TARGET = ${DIR_BIN}/${TARGET}

CC = gcc
CFLAGS = -g -Wall -I${DIR_INC}

${BIN_TARGET}:${OBJ}
        $(CC) $(OBJ)  -o $@

${DIR_OBJ}/%.o:${DIR_SRC}/%.c
        $(CC) $(CFLAGS) -c  $< -o $@
.PHONY:clean
clean:
        find ${DIR_OBJ} -name *.o -exec rm -rf {} \;

 

感谢观看!!!!

以上就是全部内容,如果对您有帮助,欢迎点赞评论,或者发现有哪里写错的,欢迎指正!

 

  • 9
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

logani

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值