一般的 “遗漏分隔符“的错误主要是指:命令行之前的TAB键敲为空格键了。但是我遇见的错误,若下所示,解决的方法也在下面描述了。

 

 错误的makefile文件 

 
  
  1.  1 .PHONY :all clean 
  2.  2  
  3.  3 MKDIR = mkdir 
  4.  4 CC = gcc                                                                     
  5.  5 RM = rm 
  6.  6 RMFLAGS = -rf 
  7.  7  
  8.  8 DIR_OBJS = objs 
  9.  9 DIR_RELEASE = Release 
  10. 10 DIR_DEPS = deps 
  11. 11 DIRS = $(DIR_OBJS) $(DIR_RELEASE) $(DIR_DEPS) 
  12. 12  
  13. 13 RELEASE =  complicated 
  14. 14 RELEASE := $(addprefix $(DIR_RELEASE)/,$(RELEASE)) 
  15. 15 SRCS = $(wildcard *.c) 
  16. 16 OBJS = $(SRCS:.c=.o) 
  17. 17 OBJS := $(addprefix $(DIR_OBJS)/, $(OBJS)) 
  18. 18 DEPS = $(SRCS:.c=.dep) 
  19. 19 DEPS := $(addprefix $(DIR_DEPS)/, $(DEPS)) 
  20. 20 ifeq("$(wildcard $(DIR_OBJS))"""
  21. 21 DEP_DIR_OBJS := $(DIR_OBJS) 
  22. 22 endif 
  23. 23 ifeq("$(wildcard $(DIR_RELEASE))",""
  24. 24 DEP_DIR_RELEASE := $(DIR_RELEASE) 
  25. 25 endif 
  26. 26 ifeq("$(wildcard $(DIR_DEPS))"""
  27. 27 DEP_DIR_DEPS := $(DIR_DEPS) 
  28. 28 endif 
  29. 29  
  30. 30 all: $(RELEASE) 
  31. 31  
  32. 32 include $(DEPS) 
  33. 33  
  34. 34 $(DIRS): 
  35. 35     $(MKDIR) $@ 
  36. 36 $(RELEASE) :$(DEP_DIR_RELEASE) $(OBJS) 
  37. 37     $(CC) -o $@ $(filter %.o,$^) 
  38. 38 $(DIR_OBJS)/%.o :$(DEP_DIR_OBJS) %.c 
  39. 39     $(CC) -o $@ -c $(filter %.c,$^) 
  40. 40 $(DIR_DEPS)/%.dep : $(DEP_DIR_DEPS) %.c 
  41. 41     @echo "Creating $@ ..." 
  42. 42     @set -e;\ 
  43. 43     $(RM) $(RMFLAGS) $@.tmp;\ 
  44. 44     $(CC) -E -MM $(filter %.c,$^) > $@.tmp;\ 
  45. 45     sed 's,\(.*\)\.o[ :]*, objs/\1.o: ,g' < $@.tmp > $@ ;\ 
  46. 46     $(RM) $(RMFLAGS) $@.tmp 
  47. 47 clean: 
  48. 48     $(RM) $(RMFLAGS) $(DIRS)         

使用make指令后,提示如下错误:

 

 
  
  1. [rts@localhost complicated]$ make  
  2. Makefile:20: *** 遗漏分隔符 。 停止。 
  3. [rts@localhost complicated]$ vi Makefile  
  4. [rts@localhost complicated]$ make 
  5. Makefile:20: 

原因:错误的makefile文件中表黄的行中,ifeq和后面的“(“号之间没有空格,加入空格后,就可以正常编译了。

造成这种错误的问题在于:在编程语言中,使用if else 分支结构的时候,习惯性的将if和之后的"(" 连接在一起使用,并且检查的时候,不会注意到这些东西。但在makefile文件的编写中,一定不要有这样的错误,不然就会报错的。

 

正确的makefile文件如下所示:

修改后的makefile文件

 
  
  1.  1 .PHONY :all clean                                                            
  2.  2  
  3.  3 MKDIR = mkdir 
  4.  4 CC = gcc 
  5.  5 RM = rm 
  6.  6 RMFLAGS = -rf 
  7.  7  
  8.  8 DIR_OBJS = objs 
  9.  9 DIR_RELEASE = Release 
  10. 10 DIR_DEPS = deps 
  11. 11 DIRS = $(DIR_OBJS) $(DIR_RELEASE) $(DIR_DEPS) 
  12. 12  
  13. 13 RELEASE =  complicated 
  14. 14 RELEASE := $(addprefix $(DIR_RELEASE)/,$(RELEASE)) 
  15. 15 SRCS = $(wildcard *.c) 
  16. 16 OBJS = $(SRCS:.c=.o) 
  17. 17 OBJS := $(addprefix $(DIR_OBJS)/, $(OBJS)) 
  18. 18 DEPS = $(SRCS:.c=.dep) 
  19. 19 DEPS := $(addprefix $(DIR_DEPS)/, $(DEPS)) 
  20. 20 ifeq ("$(wildcard $(DIR_OBJS))"""
  21. 21 DEP_DIR_OBJS := $(DIR_OBJS) 
  22. 22 endif 
  23. 23 ifeq ("$(wildcard $(DIR_RELEASE))",""
  24. 24 DEP_DIR_RELEASE := $(DIR_RELEASE) 
  25. 25 endif 
  26. 26 ifeq ("$(wildcard $(DIR_DEPS))"""
  27. 27 DEP_DIR_DEPS := $(DIR_DEPS) 
  28. 28 endif 
  29. 29  
  30. 30 all: $(RELEASE) 
  31. 31  
  32. 32 include $(DEPS) 
  33. 33  
  34. 34 $(DIRS): 
  35. 35     $(MKDIR) $@ 
  36. 36 $(RELEASE) :$(DEP_DIR_RELEASE) $(OBJS) 
  37. 37     $(CC) -o $@ $(filter %.o,$^) 
  38. 38 $(DIR_OBJS)/%.o :$(DEP_DIR_OBJS) %.c 
  39. 39     $(CC) -o $@ -c $(filter %.c,$^) 
  40. 40 $(DIR_DEPS)/%.dep : $(DEP_DIR_DEPS) %.c 
  41. 41     @echo "Creating $@ ..." 
  42. 42     @set -e;\ 
  43. 43     $(RM) $(RMFLAGS) $@.tmp;\ 
  44. 44     $(CC) -E -MM $(filter %.c,$^) > $@.tmp;\ 
  45. 45     sed 's,\(.*\)\.o[ :]*, objs/\1.o: ,g' < $@.tmp > $@ ;\ 
  46. 46     $(RM) $(RMFLAGS) $@.tmp 
  47. 47 clean: 
  48. 48     $(RM) $(RMFLAGS) $(DIRS)         

修改后编译的结果如下:

 

 
  
  1. [rts@localhost complicated]$ make 
  2. Makefile:32: deps/foo.dep: 没有那个文件或目录 
  3. Makefile:32: deps/main.dep: 没有那个文件或目录 
  4. mkdir deps 
  5. Creating deps/main.dep ... 
  6. Creating deps/foo.dep ... 
  7. mkdir Release 
  8. mkdir objs 
  9. gcc -o objs/foo.o -c foo.c 
  10. gcc -o objs/main.o -c main.c 
  11. gcc -o Release/complicated objs/foo.o objs/main.o 
  12. [rts@localhost complicated]$ ls 
  13. deps  foo.c  foo.h  main.c  Makefile  objs  Release