使文件语法错误 - 缺少分隔符

khe*_*eya 0 makefile

我在下面第139行得到make文件错误,$(eval $(RULES)) 我对make文件语法缺乏经验.这是我输入make命令时给出的错误.

common.mak:139: *** missing separator.  Stop.
Run Code Online (Sandbox Code Playgroud)

我试图通过单个空格删除选项卡,\ t无效.你知道原因是什么吗?

谢谢

#
# common bits used by all libraries
#

# first so "all" becomes default target
all: all-yes

ifndef SUBDIR

ifndef V
Q      = @
ECHO   = printf "$(1)\t%s\n" $(2)
BRIEF  = CC CXX HOSTCC HOSTLD AS YASM AR LD STRIP CP
SILENT = DEPCC DEPHOSTCC DEPAS DEPYASM RANLIB RM

MSG    = $@
M      = @$(call ECHO,$(TAG),$@);
$(foreach VAR,$(BRIEF), \
    $(eval override $(VAR) = @$$(call ECHO,$(VAR),$$(MSG)); $($(VAR))))
$(foreach VAR,$(SILENT),$(eval override $(VAR) = @$($(VAR))))
$(eval INSTALL = @$(call ECHO,INSTALL,$$(^:$(SRC_DIR)/%=%)); $(INSTALL))
endif

ALLFFLIBS = avcodec avdevice avfilter avformat avresample avutil postproc swscale swresample

# NASM requires -I path terminated with /
IFLAGS     := -I. -I$(SRC_PATH)/
CPPFLAGS   := $(IFLAGS) $(CPPFLAGS)
CFLAGS     += $(ECFLAGS)
CCFLAGS     = $(CPPFLAGS) $(CFLAGS)
ASFLAGS    := $(CPPFLAGS) $(ASFLAGS)
CXXFLAGS   += $(CPPFLAGS) $(CFLAGS)
YASMFLAGS  += $(IFLAGS:%=%/) -Pconfig.asm

HOSTCCFLAGS = $(IFLAGS) $(HOSTCPPFLAGS) $(HOSTCFLAGS)
LDFLAGS    := $(ALLFFLIBS:%=$(LD_PATH)lib%) $(LDFLAGS)

define COMPILE
       $(call $(1)DEP,$(1))
       $($(1)) $($(1)FLAGS) $($(1)_DEPFLAGS) $($(1)_C) $($(1)_O) $<
endef

COMPILE_C = $(call COMPILE,CC)
COMPILE_CXX = $(call COMPILE,CXX)
COMPILE_S = $(call COMPILE,AS)

%.o: %.c
    $(COMPILE_C)

%.o: %.cpp
    $(COMPILE_CXX)

%.s: %.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -S -o $@ $<

%.o: %.S
    $(COMPILE_S)

%.i: %.c
    $(CC) $(CCFLAGS) $(CC_E) $<

%.h.c:
    $(Q)echo '#include "$*.h"' >$@

%.ver: %.v
    $(Q)sed 's/$$MAJOR/$($(basename $(@F))_VERSION_MAJOR)/' $^ > $@

%.c %.h: TAG = GEN

# Dummy rule to stop make trying to rebuild removed or renamed headers
%.h:
    @:

# Disable suffix rules.  Most of the builtin rules are suffix rules,
# so this saves some time on slow systems.
.SUFFIXES:

# Do not delete intermediate files from chains of implicit rules
$(OBJS):
endif

include $(SRC_PATH)/arch.mak

OBJS      += $(OBJS-yes)
FFLIBS    := $(FFLIBS-yes) $(FFLIBS)
TESTPROGS += $(TESTPROGS-yes)

LDLIBS       = $(FFLIBS:%=%$(BUILDSUF))
FFEXTRALIBS := $(LDLIBS:%=$(LD_LIB)) $(EXTRALIBS)

EXAMPLES  := $(EXAMPLES:%=$(SUBDIR)%-example$(EXESUF))
OBJS      := $(sort $(OBJS:%=$(SUBDIR)%))
TESTOBJS  := $(TESTOBJS:%=$(SUBDIR)%) $(TESTPROGS:%=$(SUBDIR)%-test.o)
TESTPROGS := $(TESTPROGS:%=$(SUBDIR)%-test$(EXESUF))
HOSTOBJS  := $(HOSTPROGS:%=$(SUBDIR)%.o)
HOSTPROGS := $(HOSTPROGS:%=$(SUBDIR)%$(HOSTEXESUF))
TOOLS     += $(TOOLS-yes)
TOOLOBJS  := $(TOOLS:%=tools/%.o)
TOOLS     := $(TOOLS:%=tools/%$(EXESUF))
HEADERS   += $(HEADERS-yes)

DEP_LIBS := $(foreach NAME,$(FFLIBS),lib$(NAME)/$($(CONFIG_SHARED:yes=S)LIBNAME))

SRC_DIR    := $(SRC_PATH)/lib$(NAME)
ALLHEADERS := $(subst $(SRC_DIR)/,$(SUBDIR),$(wildcard $(SRC_DIR)/*.h $(SRC_DIR)/$(ARCH)/*.h))
SKIPHEADERS += $(ARCH_HEADERS:%=$(ARCH)/%) $(SKIPHEADERS-)
SKIPHEADERS := $(SKIPHEADERS:%=$(SUBDIR)%)
HOBJS        = $(filter-out $(SKIPHEADERS:.h=.h.o),$(ALLHEADERS:.h=.h.o))
checkheaders: $(HOBJS)
.SECONDARY:   $(HOBJS:.o=.c)

alltools: $(TOOLS)

$(HOSTOBJS): %.o: %.c
    $(call COMPILE,HOSTCC)

$(HOSTPROGS): %$(HOSTEXESUF): %.o
    $(HOSTLD) $(HOSTLDFLAGS) $(HOSTLD_O) $< $(HOSTLIBS)

$(OBJS):     | $(sort $(dir $(OBJS)))
$(HOBJS):    | $(sort $(dir $(HOBJS)))
$(HOSTOBJS): | $(sort $(dir $(HOSTOBJS)))
$(TESTOBJS): | $(sort $(dir $(TESTOBJS)))
$(TOOLOBJS): | tools

OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOBJS) $(HOSTOBJS) $(TESTOBJS))

CLEANSUFFIXES     = *.d *.o *~ *.h.c *.map *.ver *.ho *.gcno *.gcda
DISTCLEANSUFFIXES = *.pc
LIBSUFFIXES       = *.a *.lib *.so *.so.* *.dylib *.dll *.def *.dll.a

define RULES
clean::
    $(RM) $(OBJS) $(OBJS:.o=.d)
    $(RM) $(HOSTPROGS)
    $(RM) $(TOOLS)
endef

$(eval $(RULES))

-include $(wildcard $(OBJS:.o=.d) $(HOSTOBJS:.o=.d) $(TESTOBJS:.o=.d) $(HOBJS:.o=.d))
Run Code Online (Sandbox Code Playgroud)

til*_*uki 5

我有同样的问题 - 在Windows上检查FFMPEG 但使用git.

运行后configure,当make我尝试运行时,我得到了相同的一行:

  common.mak:139: *** missing separator.  Stop.
Run Code Online (Sandbox Code Playgroud)

正如@MadScientist所建议的那样 - Makefiles特别挑剔,不仅仅是tab(\ t),还有行结尾的选择(LF vs. CRLF).

这取决于GNU make命令,它必须运行它们 - 这似乎只是尊重LF.

所以*nix版本,如此,将起作用:

在此输入图像描述

这是Windows下的同一个文件,不起作用:

在此输入图像描述

(另一个赠品是它也更大,每行末尾的字节加倍!)

底线(可以这么说)是你可能需要重新格式化你的文件 - 也许是通过使用dos2unix命令.

即使不直接从git克隆,这仍然是这种情况 - 而是下载一个本身是从git clone创建的tar/zip.线的末尾将被保留.

或者,如果使用Git(就像我一样),你必须告诉它如何处理行尾字符.当它检出/克隆以及何时提交.

这里有一个完整的描述:http://adaptivepatchwork.com/2012/03/01/mind-the-end-of-your-line/

以及如何通过[core].eol设置配置(对于旧版本的git).

这在Windows上也很明显,如果您运行安装程序(例如http://git-scm.com/downloads),您将获得如下对话:

在此输入图像描述

选择"按原样结帐,按原样提交"的最终选项为我修复了它.也许不是最原则的方式,但它迫使LF结尾被保留.


小智 5

尝试配置ffmpeg时,我遇到了同样的问题make.使用当前版本的ffmpeg的主分支,问题出现在第160行的common.mak.

为了解决这个问题,我尝试了以下步骤:

  • git config core.autocrlf false
  • 删除所有*.mak文件
  • git reset --hard

仅这些步骤并没有完全解决我的问题.根据有关TAB(\ t)字符的提示,我改变了第160行

来自git repo的原始文件

改变了档案

注意在和之间的第160行的箭头(表示TAB).这个TAB为我解决了这个问题.我不得不将此更改更改为另一个文件.另一个文件有相同的错误消息.顺便说一下,Notepad ++是一个很好的工具,可以插入TAB以及更改行结尾.$(eval $(RULES))*.mak

由于ffmpeg需要一段时间才能建造,我决定分享我的解决方案......