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))
规则中的模式替换 ( 目录结构 ):
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 实战时不可或缺的部分
- 规则中的模式匹配可以直接针对目录中的文件
- 可以使用命令行变量编译特殊的目标版本
上一篇: Python 编程从入门到实践 6-7动手试一试 人
下一篇: SiteMesh框架统一布局用法介绍