第10课 - 变量与函数的综合示例

1. 实战需求

(1)自动生成 target 文件夹存放可执行文件

(2)自动生成 objs 文件夹存放编译生成的目标文件(*.o)

(3)支持调试版本编译选项,支持打印调试信息

(4)考虑代码的扩展性  ————> 使用变量

 

2. 工具原料:两个预定义的函数

— $(wildcard _pattern)

  • 获取当前工作目录满足_pattern的文件或目录列表

— $(addprefix _prefix, _names)

  • 名字列表_names中的每一个名字增加前缀_prefix

 

3. 关键技巧

  — 自动获取当前目录下的源文件列表(函数调用)

    • SRCS := $(wildcard *.c)  

  — 根据源文件列表生成目标文件列表(变量的值替换

    • OBJS := $(SRCS:.c=.o)  

  — 对每一个目标文件列表加上路径前缀(函数调用)

    • OBJS := $(addprefix path/, $(OBJS))

 

4. 规则中的模式替换(目录结构)

— $(OBJS) : %.o : %.c 形式的模式替换对象是$(OBJS)对应的目标列表

  

 

%.o : %.c 形式的模式替换对象当前工作目录

        

 

5. 编译规则的依赖

首先创建 objs 和 target 文件夹分别用来存放 .o 中间文件和可执行程序,然后创建 .o 中间文件和可执行程序,需要在前面添加前缀(放入前面创建的目录中)。

根据(DIRS)(DIRS)、(OBJS)两个依赖创建文件夹和相应的 .o 文件。后面再由模式匹配生成 .o 文件。自上而下的一种委派

 

编程实验:

CC := gcc
MKDIR := mkdir
RM := rm -fr

DIR_OBJS := objs
DIR_TARGET := target

DIRS := $(DIR_OBJS) $(DIR_TARGET)

TARGET := $(DIR_TARGET)/hello-makefile.out
# main.c const.c func.c
SRCS := $(wildcard *.c)
# main.o const.o func.o
OBJS := $(SRCS:.c=.o)
# objs/main.o objs/const.o objs/func.o
OBJS := $(addprefix $(DIR_OBJS)/, $(OBJS))

.PHONY : rebuild clean all

$(TARGET) : $(DIRS) $(OBJS)
    $(CC) -o $@ $(OBJS)
    @echo "Target File ==> $@"
    
$(DIRS) :
    $(MKDIR) $@
    

$(DIR_OBJS)/%.o : %.c
    ifeq ($(DEBUG),true)
        $(CC) -o $@ -g -c $^ 
    else   
        $(CC) -o $@ -c $^
    endif
    
rebuild : clean all

all : $(TARGET)

clean :
    $(RM) $(DIRS)
    
    

运行结果:

  

 

 

6. 小结

— 目录可以成为目标的依赖,在规则中创建目录

 预定义函数makefile实战时不可或缺的部分

规则中的模式匹配可以直接针对目录中的文件

— 可以使用命令行变量编译特殊的目标版本

 

posted @ 2018-09-05 23:54  梦心之魂  阅读(238)  评论(0编辑  收藏  举报