Makefile3文件是对于几种依赖关系的写法的对比:
1)出错调试make all --debug=v
2).dep文件的生成方法(6条语句,这里用临时文件作为缓存)
$(DIR_DEPS)/%.dep:%.c
@echo "Creating $@ ..." #临时文件作为中介居然被删除了两次
@set -e; \
$(RM) $(RMCMD) $@.tmp; \
$(CC) -E -MM $^ > $@.tmp; \
sed 's,\(.*\)\.o[ :]*,objs/\1.o: ,g' < $@.tmp > $@ ; \
$(RM) $(RMCMD) $@.tmp
3)在某目录下生成.o文件的办法:
$(dir)/%.o:prerequisite
- .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) $@
-
-
#dep1)得到两个完全一样的依赖集合,这个和OBJS是一样的道理:目标集合与依赖集合变成了一对多的关系,应该是一对一的关系
-
#$(DEPS):$(SRCS)
-
# $(CC) -E -MM $^ > $@
-
-
#dep2)如下方案可以得到一对一关系的目标集合与依赖关系,但是不能加入.dep格式的文件,include会显示找不到文件,包含dep格式文件的操作会失败
-
#$(DIR_DEPS)/%.dep:%.c
-
# $(CC) -E -MM $^ > $@
-
-
#dep3)如下方案与上面的方案一样可以生成一对一关系的目标集合与依赖集合,但是仍然需要include且直接include会失败
-
$(DIR_DEPS)/%.dep:%.c
-
@echo "Creating $@ ..." #临时文件作为中介居然被删除了两次
-
@set -e; \
-
$(RM) $(RMCMD) $@.tmp; \
-
$(CC) -E -MM $^ > $@.tmp; \
-
sed 's,\(.*\)\.o[ :]*,objs/\1.o: ,g' < $@.tmp > $@ ; \
-
$(RM) $(RMCMD) $@.tmp
-
-
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) $^
Makefile3
阅读(1262) | 评论(0) | 转发(0) |