http://blog.sina.com.cn/s/blog_87c063060101c9yp.html
1、在写 多目录下makefile的时候,碰到一个错误提示,让我纠结许久,后面还是解决了,这个错误不容易被发现。
2、错误提示如下:
Makefile:8: *** missing separator (did you mean TAB instead of 8 spaces?).
3、先来说一下我想干什么,有些什么?
想干什么: 搭建一个Linux
有什么:父目录①←子目录①(build目录)、子目录①(code目录)
子目录①(build目录)←Makefile
子目录①(code目录)← 子目录②(startup)、子目录②(lib)、子目录②(foo)、子目录②(huge)
如下图:
1.工程目录下:
2.build 目录下
3.code目录下
4.code目录下的子目录都有2个子目录: src目录(存放.c文件) 、 include目录(存放.h文件)
5、下面贴一下makefile的内容
a.
.PHONY:all clean
CC
LD
AR
ARFLAGS = crs
OBJCOPY
OBJDUMP
CFLAGS := -Wall -O2
RM
RMFLAGS = -fr
export CC LD AR
SRCS
ASS
OBJS := $(SRCS:.c=.o)
ASMS := $(ASS:.S=.o )
DEPS := $(SRCS:.c=.dep)
ifneq ("$(EXE)","")
EXE
RMS
endif
ifneq ("$(LIB)","")
LIB
RMS
endif
ifneq ($(INCLUDE_DIRS), "")
INCLUDE_DIRS := $(strip $(INCLUDE_DIRS))
INCLUDE_DIRS := $(addprefix -I, $(INCLUDE_DIRS))
endif
ifneq ($(LINK_LIBS), "")
LINK_LIBS := $(strip $(LINK_LIBS))
LIB_ALL := $(notdir $(wildcard $(DIR_LIB)/*))
LIB_FILTERED := $(addsffix %,$(addprefix lib, $(LINK_LIBS)))
$(evel DEP_LIBS = $(filter $(LIB_FILTERED), $(LIB_ALL) ) )
DEP_LIBS := $(addprefix $(DIR_LIBS)/, $(DEP_LIBS))
LINK_LIBS := $(addprefix -l, $(LINK_LIBS))
endif
all: $(EXE) $(LIB)
$(EXE):$(OBJS) $(LIB)
$(LIB):$(ASMS) $(OBJS)
%.o : %.c
%.o : %.S
%.dep: %.c
clean:
b.
.PHONY: all clean
ROOT = $(realpath ..)
#注意:因为 huge目录下 是编译 可执行文件(最终目标).所以对于 foo bar huge 这三个目录,huge 需要放到 最后编译。
DIRS = $(ROOT)/code/startup/src \
RM = rm
RMFLAGS = -fr
RMS = $(ROOT)/build/exes
all clean:
touch:
c.huge/src
EXE = huge.bin
LIB =
INCLUDE_DIRS = $(ROOT)/code/huge/include
LINK_LIBS = startup lib foo
include $(ROOT)/build/make.rule
d. startup/src 目录下面Makefile的写法:
#2012-10-21
EXE =
LIB = libstartup.a
INCLUDE_DIRS = $(ROOT)/code/startup/include \
LINK_LIBS =
include $(ROOT)/build/make.rule
e.
#2012-10-21
EXE =
LIB = libfoo.a
INCLUDE_DIRS = $(ROOT)/code/foo/include
LINK_LIBS =
include $(ROOT)/build/make.rule
f. lib/src 目录下的Makefile :
#2012-10-21
EXE =
LIB = liblib.a
INCLUDE_DIRS = $(ROOT)/code/lib/include
LINK_LIBS =
include $(ROOT)/build/make.rule
PS:我们重点注意 我们标色的 地方,其它地方不用看。
⑴
INCLUDE_DIRS = $(ROOT)/code/huge/include \
$(ROOT)/code/startup/include \
$(ROOT)/code/lib/include \
$(ROOT)/code/foo/include
PS:在 huge目录下的 C文件 包含了其它目录下面的头文件时(如 foo/include 下面的 2440addr.h),
main.c(假设在 huge/src下):
#include"2440addr.h"
#include"stdio.h"
............
像这样子的 程序,头文件 在 "别人的目录下面" 你想用它
如果 将 上面改成 下面这样,就会出现 "文章开始的错误了" :
INCLUDE_DIRS =$(ROOT)/code/lib/include \
$(ROOT)/code/startup/include \
$(ROOT)/code/huge/include \
$(ROOT)/code/foo/include
错误提示:Makefile:8: *** missing separator (did you mean TAB instead of 8 spaces?). Stop.
同理下面也是一样的.
⑵
INCLUDE_DIRS = $(ROOT)/code/startup/include \
$(ROOT)/code/foo/include