目录
一、什么是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 {} \;
感谢观看!!!!
以上就是全部内容,如果对您有帮助,欢迎点赞评论,或者发现有哪里写错的,欢迎指正!