一般的 “遗漏分隔符“的错误主要是指:命令行之前的TAB键敲为空格键了。但是我遇见的错误,若下所示,解决的方法也在下面描述了。
错误的makefile文件
- 1 .PHONY :all clean
- 2
- 3 MKDIR = mkdir
- 4 CC = gcc
- 5 RM = rm
- 6 RMFLAGS = -rf
- 7
- 8 DIR_OBJS = objs
- 9 DIR_RELEASE = Release
- 10 DIR_DEPS = deps
- 11 DIRS = $(DIR_OBJS) $(DIR_RELEASE) $(DIR_DEPS)
- 12
- 13 RELEASE = complicated
- 14 RELEASE := $(addprefix $(DIR_RELEASE)/,$(RELEASE))
- 15 SRCS = $(wildcard *.c)
- 16 OBJS = $(SRCS:.c=.o)
- 17 OBJS := $(addprefix $(DIR_OBJS)/, $(OBJS))
- 18 DEPS = $(SRCS:.c=.dep)
- 19 DEPS := $(addprefix $(DIR_DEPS)/, $(DEPS))
- 20 ifeq("$(wildcard $(DIR_OBJS))", "")
- 21 DEP_DIR_OBJS := $(DIR_OBJS)
- 22 endif
- 23 ifeq("$(wildcard $(DIR_RELEASE))","")
- 24 DEP_DIR_RELEASE := $(DIR_RELEASE)
- 25 endif
- 26 ifeq("$(wildcard $(DIR_DEPS))", "")
- 27 DEP_DIR_DEPS := $(DIR_DEPS)
- 28 endif
- 29
- 30 all: $(RELEASE)
- 31
- 32 include $(DEPS)
- 33
- 34 $(DIRS):
- 35 $(MKDIR) $@
- 36 $(RELEASE) :$(DEP_DIR_RELEASE) $(OBJS)
- 37 $(CC) -o $@ $(filter %.o,$^)
- 38 $(DIR_OBJS)/%.o :$(DEP_DIR_OBJS) %.c
- 39 $(CC) -o $@ -c $(filter %.c,$^)
- 40 $(DIR_DEPS)/%.dep : $(DEP_DIR_DEPS) %.c
- 41 @echo "Creating $@ ..."
- 42 @set -e;\
- 43 $(RM) $(RMFLAGS) $@.tmp;\
- 44 $(CC) -E -MM $(filter %.c,$^) > $@.tmp;\
- 45 sed 's,\(.*\)\.o[ :]*, objs/\1.o: ,g' < $@.tmp > $@ ;\
- 46 $(RM) $(RMFLAGS) $@.tmp
- 47 clean:
- 48 $(RM) $(RMFLAGS) $(DIRS)
使用make指令后,提示如下错误:
- [rts@localhost complicated]$ make
- Makefile:20: *** 遗漏分隔符 。 停止。
- [rts@localhost complicated]$ vi Makefile
- [rts@localhost complicated]$ make
- Makefile:20:
原因:错误的makefile文件中表黄的行中,ifeq和后面的“(“号之间没有空格,加入空格后,就可以正常编译了。
造成这种错误的问题在于:在编程语言中,使用if else 分支结构的时候,习惯性的将if和之后的"(" 连接在一起使用,并且检查的时候,不会注意到这些东西。但在makefile文件的编写中,一定不要有这样的错误,不然就会报错的。
正确的makefile文件如下所示:
修改后的makefile文件
- 1 .PHONY :all clean
- 2
- 3 MKDIR = mkdir
- 4 CC = gcc
- 5 RM = rm
- 6 RMFLAGS = -rf
- 7
- 8 DIR_OBJS = objs
- 9 DIR_RELEASE = Release
- 10 DIR_DEPS = deps
- 11 DIRS = $(DIR_OBJS) $(DIR_RELEASE) $(DIR_DEPS)
- 12
- 13 RELEASE = complicated
- 14 RELEASE := $(addprefix $(DIR_RELEASE)/,$(RELEASE))
- 15 SRCS = $(wildcard *.c)
- 16 OBJS = $(SRCS:.c=.o)
- 17 OBJS := $(addprefix $(DIR_OBJS)/, $(OBJS))
- 18 DEPS = $(SRCS:.c=.dep)
- 19 DEPS := $(addprefix $(DIR_DEPS)/, $(DEPS))
- 20 ifeq ("$(wildcard $(DIR_OBJS))", "")
- 21 DEP_DIR_OBJS := $(DIR_OBJS)
- 22 endif
- 23 ifeq ("$(wildcard $(DIR_RELEASE))","")
- 24 DEP_DIR_RELEASE := $(DIR_RELEASE)
- 25 endif
- 26 ifeq ("$(wildcard $(DIR_DEPS))", "")
- 27 DEP_DIR_DEPS := $(DIR_DEPS)
- 28 endif
- 29
- 30 all: $(RELEASE)
- 31
- 32 include $(DEPS)
- 33
- 34 $(DIRS):
- 35 $(MKDIR) $@
- 36 $(RELEASE) :$(DEP_DIR_RELEASE) $(OBJS)
- 37 $(CC) -o $@ $(filter %.o,$^)
- 38 $(DIR_OBJS)/%.o :$(DEP_DIR_OBJS) %.c
- 39 $(CC) -o $@ -c $(filter %.c,$^)
- 40 $(DIR_DEPS)/%.dep : $(DEP_DIR_DEPS) %.c
- 41 @echo "Creating $@ ..."
- 42 @set -e;\
- 43 $(RM) $(RMFLAGS) $@.tmp;\
- 44 $(CC) -E -MM $(filter %.c,$^) > $@.tmp;\
- 45 sed 's,\(.*\)\.o[ :]*, objs/\1.o: ,g' < $@.tmp > $@ ;\
- 46 $(RM) $(RMFLAGS) $@.tmp
- 47 clean:
- 48 $(RM) $(RMFLAGS) $(DIRS)
修改后编译的结果如下:
- [rts@localhost complicated]$ make
- Makefile:32: deps/foo.dep: 没有那个文件或目录
- Makefile:32: deps/main.dep: 没有那个文件或目录
- mkdir deps
- Creating deps/main.dep ...
- Creating deps/foo.dep ...
- mkdir Release
- mkdir objs
- gcc -o objs/foo.o -c foo.c
- gcc -o objs/main.o -c main.c
- gcc -o Release/complicated objs/foo.o objs/main.o
- [rts@localhost complicated]$ ls
- deps foo.c foo.h main.c Makefile objs Release
转载于:https://blog.51cto.com/lingangw/1065108