Makefile2文件开始引入规范的写法,解决问题如下:
1)目标与依赖集合之间的一对一关系的建立和一对多关系的排除:
使用%.o:%.c代替简单变量
2)使用gcc自动生成依赖关系并放到.dep文件中,但需要Include,而在Include的执行在Makefile的
第一阶段,这个时候.dep文件还没有生成,故需要添加.dep文件的生成方法及依赖关系
3)Include除了加入其他的Makefile的功能(类似宏)以外还有可以根据依赖关系自动生成文件的功能
- .PHONY:all clean
-
-
CC = gcc
-
RM = rm
-
RMCMD = -rf
-
MKDIR = mkdir
-
-
DIR = objs exes deps
-
DIR_OBJS = objs
-
DIR_EXES = exes
-
DIR_DEPS = deps
-
SRCS = $(wildcard *.c)
-
OBJS = $(SRCS:.c=.o)
-
OBJS := $(addprefix $(DIR_OBJS)/,$(OBJS))
-
EXE = complicated
-
EXE := $(addprefix $(DIR_EXES)/,$(EXE))
-
DEPS = $(SRCS:.c=.dep)
-
DEPS := $(addprefix $(DIR_DEPS)/,$(DEPS))
-
-
all:$(DIR) $(DEPS) $(EXE)
-
-
$(DIR):
-
$(MKDIR) $@
-
-
#如下方案会重复生成依赖关系,得到两个完全一样的依赖集合,这个和OBJS是一样的道理:目标集合与依赖集合变成了一对多的关系,应该是一对一的关系
-
#$(DEPS):$(SRCS)
-
# $(CC) -E -MM $^ > $@
-
-
#如下方案可行,但是不能加入.dep格式的文件,include会显示找不到文件,包含dep格式的文件会失败
-
$(DIR_DEPS)/%.dep:%.c
-
$(CC) -E -MM $^ > $@
-
-
#include $(DEPS)
-
-
#如下方案可以在目录下生成所有.o文件
-
$(DIR_OBJS)/%.o:%.c
-
$(CC) -o $@ -c $^
-
-
#但是如下方法却有问题:原因在于他没有一一对应的关系,比如一个Hello.o会依赖Hello.c和main_hello.c两个文件
-
#$(OBJS):$(SRCS)
-
# $(CC) -o $@ -c $^
-
-
$(EXE):$(OBJS)
-
$(CC) -o $@ $^
-
-
clean:$(DIR)
-
$(RM) $(RMCMD) $^
Makefile2
阅读(1524) | 评论(0) | 转发(0) |