第19课 - 路径搜索的综合示例

1. 需求分析

  • 工程项目中不希望源码文件夹在编译时被改动 ( 只读文件夹 )
  • 在编译时自动创建文件夹 ( build ) 用于存放编译结果
  • 编译过程中能够自动搜索需要的文件
  • makefile 易于扩展,能够复用相同类型的项目
  • 支持调试版本的编译选项

2. 项目类型分析

在这里插入图片描述

3. 需要使用的预定义函数

  • $(wildcare $(DIR)/_pattern) 用于获取 $(DIR) 文件夹中满足_pattern 的文件
  • $(notdir _names) 用于去除 _names 中每一个文件名的路径前缀
  • $(patsubst _pattern,replacement,_text) 用于将_text 中符合 _
    pattern 的部分替换为 replacement

4. 示例Demo

.PHONY : all clean

DIR_BUILD := build
DIR_SRC := src
DIR_INC := inc

TYPE_INC := .h
TYPE_SRC := .c
TYPE_OBJ := .o

CC := gcc
LFLAGS :=
CFLAGS := -I $(DIR_INC)
ifeq ($(DEBUG),true)
CFLAGS += -g
endif

MKDIR := mkdir
RM := rm -fr

APP := $(DIR_BUILD)/app.out
HDRS := $(wildcard $(DIR_INC)/*$(TYPE_INC))
HDRS := $(notdir $(HDRS))
OBJS := $(wildcard $(DIR_SRC)/*$(TYPE_SRC))
OBJS := $(OBJS:$(TYPE_SRC)=$(TYPE_OBJ))
OBJS := $(patsubst $(DIR_SRC)/%, $(DIR_BUILD)/%, $(OBJS))

vpath %$(TYPE_INC) $(DIR_INC)
vpath %$(TYPE_SRC) $(DIR_SRC)

all : $(DIR_BUILD) $(APP)
	@echo "Target File ==> $(APP)"
	
$(DIR_BUILD) :
	$(MKDIR) $@
	
$(APP) : $(OBJS)
	$(CC) $(LFLAGS) -o $@ $^
	
$(DIR_BUILD)/%$(TYPE_OBJ) : %$(TYPE_SRC) $(HDRS)
	$(CC) $(CFLAGS) -o $@ -c $<
	
clean :
	$(RM) $(DIR_BUILD)

5. 总结

  • 工程项目中不希望源码文件在编译时被改动
  • 模式规则的灵活运用使得 makefile 具有复用性
  • 变量的灵活运用使得 makefile 具有扩展性
  • 规模较小的项目没必要使用自动生成依赖关系的解决方案
  • 规则较小的项目可以直接让源码文件依赖于头文件 ( 易于维护 )
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值