欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-11 20:05:13
...

1. 实战前的分析

实战需求:

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

工具原料:

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

关键技巧:

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

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

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

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 aaa@qq.com $(OBJS)
	@echo "Target File ==> aaa@qq.com"
	
$(DIRS) :
	$(MKDIR) aaa@qq.com
	

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

all : $(TARGET)

clean :
	$(RM) $(DIRS)

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

3. 总结

  • 目标可以成为目标的依赖,在规则中创建目录
  • 预定义函数是 makefile 实战时不可或缺的部分
  • 规则中的模式匹配可以直接针对目录中的文件
  • 可以使用命令行变量编译特殊的目标版本
相关标签: Makefile