Makefile多个目录下的编译
notdir函数
otdir函数用于去除文件路径中的目录部分。它的格式如下:
$(notdir 文件名)
wildcard函数
wildcard函数用于获取文件列表,并使用空格分隔开。它的格式如下:
$(wildcard 匹配规则)
patsubst函数
patsubst函数功能为模式字符串替换。它的格式如下:
$(patsubst 匹配规则, 替换规则, 输入的字符串)
实例
源码文件目录格式如下:
#定义变量
TARGET = hello_main
#存放中间文件的路径
BUILD_DIR = build
#存放源文件的文件夹
SRC_DIR = sources
#存放头文件的文件夹
INC_DIR = includes .
#源文件
SRCS = $(wildcard $(SRC_DIR)/*.c) //把sources文件夹下后缀为.c的文件用SRCS表示
#目标文件(*.o)
OBJS = $(patsubst %.c, $(BUILD_DIR)/%.o, $(notdir $(SRCS))) //把SRCS中后缀为.c的文件放在build目录下后缀改为.o
#头文件
DEPS = $(wildcard $(INC_DIR)/*.h) //将includes目录下后缀为.h的文件用DEPS表示
#指定头文件的路径
CFLAGS = $(patsubst %, -I%, $(INC_DIR)) //指定头文件的目录用CFLAGS表示
#目标文件
$(BUILD_DIR)/$(TARGET): $(OBJS)
$(CC) -o $@ $^ $(CFLAGS)
#*.o文件的生成规则
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c $(DEPS)
#创建一个编译目录,用于存放过程文件
#命令前带“@”,表示不在终端上输出
@mkdir -p $(BUILD_DIR)
$(CC) -c -o $@ $< $(CFLAGS)
#伪目标
.PHONY: clean cleanall
#删除输出文件夹
clean:
rm -rf $(BUILD_DIR)
#全部删除
cleanall:
rm -rf $(BUILD_DIR)
在test8目录下make: