makefile学习笔记--单层make与嵌套make

【单层make】:只有一个makefile文件,放在根目录下,一次性编译链接所有文件

【嵌套make】:各级目录下都有一个makefile文件,顶层makefile负责调用底层的makefile,方便项目管理。

目录结构:(makefile_1是单层make文件,makefile_2是嵌套make文件)

一、单层make

CC := gcc

INC_DIR := ./inc
SRC_DIR := ./src
USR_DIR := ./usr
OBJ_DIR := ./obj
DEP_DIR := ./dep

SRC_FILE := $(notdir $(wildcard $(SRC_DIR)/*.c))
USR_FILE := $(notdir $(wildcard $(USR_DIR)/*.c))
OBJ_FILE := $(patsubst %.c,$(OBJ_DIR)/%.o,$(SRC_FILE) $(USR_FILE))
DEP_FILE := $(patsubst %.c,$(DEP_DIR)/%.d,$(SRC_FILE) $(USR_FILE))

VPATH := ./usr ./src 

TARGET := main

all:$(TARGET)


$(TARGET):$(OBJ_FILE)	
	$(CC) -o $@ $^


$(OBJ_DIR)/%.o:%.c
	$(CC) -c $< -o $@ -I $(INC_DIR)

#下边写法也可以,不过得找两次源文件
#$(OBJ_DIR)/%.o:$(SRC_DIR)/%.c
#	$(CC) -c $< -o $@ -I $(INC_DIR)
#$(OBJ_DIR)/%.o:$(USR_DIR)/%.c
#	$(CC) -c $< -o $@ -I $(INC_DIR)

$(DEP_FILE):$(DEP_DIR)/%.d:%.c
	-mkdir -p $(DEP_DIR)
	$(CC) -MM -E $< -I $(INC_DIR) > $@

#同上,比较麻烦,需要查找两次
#$(DEP_DIR)/%.d:$(SRC_DIR)/%.c
#	-madir -p $(DEP_DIR)
#	$(CC) -MM -E $< -I $(INC_DIR) > $@
#$(DEP_DIR)/%.d:$(USR_DIR)/%.c
#	-mkdir -p $(DEP_DIR)
#	$(CC) -MM -E $< -I $(INC_DIR) > $@

include $(DEP_FILE)


echo:
	echo USR_FILE:$(USR_FILE)
	echo SRC_FILE:$(SRC_FILE)
	echo OBJ_FILE:$(OBJ_FILE)

clean:
	rm -f $(OBJ_FILE)
	rm -f $(DEP_FILE)
	rm -f $(TARGET)

二、嵌套make(有些小问题但可以正常运行,此版本没有添加自动生成依赖文件功能)

①.根makefile

CC := gcc

export SRC_DIR := $(PWD)/src
export USR_DIR := $(PWD)/usr
export OBJ_DIR := $(PWD)/obj
export DEP_DIR := $(PWD)/dep
export INC_DIR := $(PWD)/inc
export SUB_DIR := $(SRC_DIR) $(USR_DIR)

SRC_FILE := $(wildcard $(SRC_DIR)/*.c)
USR_FILE := $(wildcard $(USR_DIR)/*.c)
OBJ_FILE := $(patsubst %.c,$(OBJ_DIR)/%.o,$(notdir $(SRC_FILE) $(USR_FILE)))
DEP_FILE := $(patsubst %.c,$(DEP_DIR)/%.d,$(notdir $(SRC_FILE) $(USR_FILE)))

TARGET := main
VPATH := $(SRC_DIR) $(USR_DIR) $(DEP_DIR) $(OBJ_DIR)

all:$(SUB_DIR) $(TARGET) 
	echo linking all object file...

$(TARGET):$(OBJ_FILE)
	$(CC) -o $@ $^

$(SUB_DIR):ECHO
	$(MAKE) -f makefile_2 -C $@

ECHO:
	echo compiling object file...

clean:
	rm -f $(OBJ_DIR)/*.o
	rm -f $(DEP_DIR)/*.d
	rm -f $(TARGET)

②.src目录makefile文件

SRC_FILE := $(wildcard *.c)
OBJ_FILE := $(patsubst %.c,$(OBJ_DIR)/%.o,$(SRC_FILE))
DEP_FILE := $(patsubst %.c,$(DEP_DIR)/%.d,$(SRC_FILE))

all:$(OBJ_FILE)
	echo compile src cfile...

$(OBJ_DIR)/%.o:%.c
	$(CC) -c $< -o $@ -I $(INC_DIR)

③.usr目录makefile文件

USR_FILE := $(wildcard *.c)
OBJ_FILE := $(patsubst %.c,$(OBJ_DIR)/%.o,$(USR_FILE))
DEP_FILE := $(patsubst %.c,$(DEP_DIR)/%.d,$(USR_FILE))

all:$(OBJ_FILE)
	echo compile usr cfile...

$(OBJ_DIR)/%.o:%.c
	$(CC) -c $< -o $@ -I $(INC_DIR)

推荐资料:跟我一起学makefile    驾驭makefile

项目地址:ZiXie/makefile

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值