最近项目有需求,需要重构一个项目的Makfefile文件, 原来的供应商提供的文件,太过复杂。故有以下学习过程,以下只做参考,如果有学习的需求, 我推荐B站Up主无限十三年跟着他的视频从头到尾敲一遍(当然不需要全敲),这只是一门编程语言,重要的是真正自己去写,和学其他语言一样,不会的去百度或者问AI,有需要的函数就去百度搜索有没有这个函数,慢慢就上手了。当前项目的Makefile我已经重构完成了,如果遇到什么问题可以留下评论。
- Makefile 是一个文本文件,定义了如何编译和链接程序。
- Make 是一个命令行工具,它会读取 Makefile 中的规则,并根据规则执行命令。
- Makefile 的核心思想是通过目标(Target)、依赖(Dependencies)和命令(Commands)来描述构建过程.
main.o: main.c
gcc -c main.c -o main.o
target: depencendices
command
遵循以上的基本格式,
# Defines the variables
CC = gcc # 编译命令
CFLAGS = -Wall -02 -Iinclude #编译标志位, 应该是可选的
SRC_DIR = src # 编译的.c文件目录
OBJ_DIR = obj # 编译后生成的.o文件
# Get all file of .c
SRCS = $(wildcard $(SRC_DIR)/*.c) #使用内置函数来返回符合规则的.c文件,规则定义为,所有SRC_DIR中的.c文件返回出来。
# Make the .c file to .o #这其实是一个路径, 包含所有.o文件的路径。
OBJS = $(patsubst $(SRC_DIR)/%.c, $(OBJ_DIR)/%.o, $(SRCS)) # 所有它只是替换了 SRCS中的文件名路径,文件名没变。所以也是返回一个LIST
# Final obj
myprogram: $(OBJS)
$(CC) $(CFLAGS) -c $< -o $@ ##### 其实这里的$<($^指代all)指的是第一个依赖项,也就是OBJS, $@指的是myprogram这个Target。
clean
rm -f $(OBJ_DIR)/*.o myprogram
1. $< 表示当前规则下的第一个依赖,在上面,它应该代替的是main.c
$@ 表示当前规则中的目标,@ , 就是@ 到目标。
- *f --> force 强制删除 rm a.txt --> 会删除a.txt文件。
这两个组合在一起就是 rm -f *.o myprogram ,会强制清除所有的.o文件和Myprogram文件, 相当于通配符,表示all;
/% , %表示模式匹配符,用于模式规则,它表示匹配任意字符串