【问题标题】:Make error: missing separator出错:缺少分隔符
【发布时间】:2010-10-29 13:21:54
【问题描述】:

我在运行make 时遇到以下错误:

Makefile:168: *** missing separator.  Stop.

这是什么原因造成的?

【问题讨论】:

标签: makefile


【解决方案1】:

online manual 中所述,导致该错误的最常见原因是当make 需要制表符时,行会缩进空格。

正确

target: 
\tcmd

\t 是制表符 (U+0009)

错误

target:
....cmd

其中每个. 代表一个SPACE (U+0020)。

【讨论】:

【解决方案2】:

这是您的 Makefile 中的语法错误。如果不查看文件本身或其相关部分,很难比这更具体。

【讨论】:

    【解决方案3】:

    以下 Makefile 代码有效:

    obj-m = hello.o
    
    all:
        $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 
    
    clean:
        $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
    

    【讨论】:

    • 请详细说明
    【解决方案4】:

    在我的情况下,错误导致了下一个。我尝试全局执行命令,即在任何目标之外。

    UPD。要在全局范围内运行命令,必须正确形成一个。例如命令

    ln -sf ../../user/curl/$SRC_NAME ./$SRC_NAME
    

    会变成:

    $(shell ln -sf ../../user/curl/$(SRC_NAME) ./$(SRC_NAME))
    

    【讨论】:

      【解决方案5】:

      只是为了笑,以防其他人遇到类似的错误:

      我得到了臭名昭著的“缺少分隔符”错误,因为我调用了一个将函数定义为的规则

      ($eval $(call function,args))
      

      而不是

      $(eval $(call function,args))
      

      ($ 而不是 $(

      【讨论】:

      • 什么? :) 我猜你那里没有0x20“空格”,对吗?
      • @user35443 $的位置
      【解决方案6】:

      对我来说,问题是我在define ... endef 多行变量定义中嵌入了一些行尾# ... cmets。移除 cmets 后问题就消失了。

      【讨论】:

      • 谢谢。我不知道 define 指令中的 cmets 按字面意思对待。实际上,the documentation 中的行为不是解释。 (为了清楚起见:在指令中嵌入数字符号 # 本身并不是语法错误。但它不会被解释为注释的开头,因此这样做无疑容易出错。)
      【解决方案7】:

      我的错误出现在带有多行扩展名的变量声明行上。我在“\”之后有一个尾随空格,这使得该行无效。

      MY_VAR = \
         val1 \ <-- 0x20 there caused the error.
         val2
      

      【讨论】:

        【解决方案8】:

        在我的例子中,这个错误是由于缺少一个空格引起的。我的 makefile 中有这个 if 块:

        if($(METHOD),opt)
        CFLAGS=
        endif
        

        应该是:

        if ($(METHOD),opt)
        CFLAGS=
        endif
        

        if 后面有一个空格

        【讨论】:

          【解决方案9】:

          显然,我只需要“build-essential”包,然后首先运行autoconf,这使得Makefile.pre.in,然后是./configure,然后是完美运行的make...

          【讨论】:

          • 完全无法理解的答案,无论如何都不适用于该问题
          【解决方案10】:

          在我的例子中,同样的错误是因为冒号:staging.deploy: 一样在末尾丢失。所以请注意,这很容易出现语法错误。

          【讨论】:

            【解决方案11】:

            我在 qmake 生成的 Makefiles 中缺少分隔符文件。我正在将 Qt 代码移植到不同的平台。我没有设置 QMAKESPEC 或 MAKE。这是我找到答案的链接:

            https://forum.qt.io/topic/3783/missing-separator-error-in-makefile/5

            【讨论】:

              【解决方案12】:

              就我而言,我实际上缺少ifeq 和下一行命令之间的选项卡。开头没有空格。

              ifeq ($(wildcard $DIR_FILE), )
              cd $FOLDER; cp -f $DIR_FILE.tpl $DIR_FILE.xs;
              endif
              

              应该是:

              ifeq ($(wildcard $DIR_FILE), )
              <tab>cd $FOLDER; cp -f $DIR_FILE.tpl $DIR_FILE.xs;
              endif
              

              注意 &lt;tab&gt; 是一个实际的制表符

              【讨论】:

                【解决方案13】:

                只是添加另一个可以显示的原因:

                $(eval VALUE)
                

                无效,将产生“缺少分隔符”错误。

                $(eval IDENTIFIER=VALUE)
                

                是可以接受的。当我用define 定义了一个宏并尝试这样做时,出现了这种错误

                define SOME_MACRO
                ... some expression ...
                endef
                
                VAR=$(eval $(call SOME_MACRO,arg))
                

                宏未计算为赋值的地方。

                【讨论】:

                  【解决方案14】:

                  我有这个是因为PHONY 后面没有冒号

                  不是这个,

                  .PHONY install
                  install:
                      install -m0755 bin/ytdl-clean /usr/local/bin
                  

                  但是这个(注意冒号)

                  .PHONY: install
                  ...
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-05-07
                    • 2016-10-04
                    相关资源
                    最近更新 更多