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

1. 实战前的分析

实战需求:

  • 自动生成 target 文件夹存放可执行文件
  • 自动生成 objs 文件夹存放编译生成的目标文件 (*.o)
  • 支持调试版本的编译选项
  • 考虑代码的扩展性

工具原料:

$(wildcard pattern)
-获取当前工作目录中满足 pattern 的文件或者目录列表
$(addprefix prefix,names)
-给名字列表 names 中的每一个名字增加前缀 prefix

关键技巧:

  • 使用 SRC := $(wildcard *.c) 自动获取当前目录下的源文件列表 (函数调用)
  • 根据源文件列表生成目标文件列表( 变量的替换),OBJS := $(SRCS:.c=.o)
  • 对每一个目标文件列表加上路径前缀 (函数调用),OBJS := $(addprefix path/,$(OBJS))

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

在这里插入图片描述

2. 实战演练

Demo:

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

DIR_OBJS := objs
DIR_TARGET := target

DIRS := $(DIR_OBJS) $(DIR_TARGET)

TARGET := $(DIR_TARGET)/hello-makefile.out
SRCS := $(wildcard *.c)
OBJS := $(SRCS:.c=.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)

代码分析:将本目录下的所有.c文件进行编译连接,生成的.o文件存放咋 objs 文件夹下,最终生成的可执行文件放在 target文件夹下

3. 总结

  • 目标可以成为目标的依赖,在规则中创建目录
  • 预定义函数是 makefile 实战时不可或缺的部分
  • 规则中的模式匹配可以直接针对目录中的文件
  • 可以使用命令行变量编译特殊的目标版本
发布了61 篇原创文章 · 获赞 31 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq_40794602/article/details/105468627