【问题标题】:Makefile.win:1: ***missing separator. StopMakefile.win:1: ***缺少分隔符。停止
【发布时间】:2012-10-29 11:33:50
【问题描述】:

我知道此错误与缺少 TAB 相关,但不知何故我无法找出第 1 行缺少选项卡的位置:

生成文件:

## -*- mode: make; tab-width: 8; -*-
##
## Simple Makefile
##
## TODO: 
##  proper configure for non-Debian file locations,   [ Done ]
##  allow RHOME to be set for non-default R etc

## comment this out if you need a different version of R, 
## and set set R_HOME accordingly as an environment variable

R_HOME =        $(shell R RHOME)

sources =       $(wildcard *.cpp)
programs =      $(sources:.cpp=)


## include headers and libraries for R 
RCPPFLAGS =         $(shell $(R_HOME)/bin/R CMD config --cppflags)
RLDFLAGS =      $(shell $(R_HOME)/bin/R CMD config --ldflags)
RBLAS =         $(shell $(R_HOME)/bin/R CMD config BLAS_LIBS)
RLAPACK =       $(shell $(R_HOME)/bin/R CMD config LAPACK_LIBS)

## if you need to set an rpath to R itself, also uncomment
#RRPATH :=      -Wl,-rpath,$(R_HOME)/lib

## include headers and libraries for Rcpp interface classes
RCPPINCL =      $(shell echo 'Rcpp:::CxxFlags()' | $(R_HOME)/bin/R --vanilla --slave)
RCPPLIBS =      $(shell echo 'Rcpp:::LdFlags()'  | $(R_HOME)/bin/R --vanilla --slave)


## include headers and libraries for RInside embedding classes
RINSIDEINCL =       $(shell echo 'RInside:::CxxFlags()' | $(R_HOME)/bin/R --vanilla --slave)
RINSIDELIBS =       $(shell echo 'RInside:::LdFlags()'  | $(R_HOME)/bin/R --vanilla --slave)

## compiler etc settings used in default make rules
CXX =           $(shell $(R_HOME)/bin/R CMD config CXX)
CPPFLAGS =      -Wall $(shell $(R_HOME)/bin/R CMD config CPPFLAGS)
CXXFLAGS =      $(RCPPFLAGS) $(RCPPINCL) $(RINSIDEINCL) $(shell $(R_HOME)/bin/R CMD 

config CXXFLAGS)
LDLIBS =        $(RLDFLAGS) $(RRPATH) $(RBLAS) $(RLAPACK) $(RCPPLIBS) $(RINSIDELIBS)

all: $(programs)
    @test -x /usr/bin/strip && strip $^

run: $(programs)
    @for p in $(programs); do echo; echo "Running $$p:"; ./$$p; done

clean:
    rm -vf $(programs)
    rm -vrf *.dSYM

runAll:
    for p in $(programs); do echo "Running $$p"; ./$$p; done

【问题讨论】:

  • 我无法重现您的错误。我建议尽量减少示例——删除行并进行测试,直到找到给出此错误的最小、最简单的 makefile。告诉我们您使用的是哪个版本的 Make (make -v) 也很有用。
  • 这几乎总是同一个问题:您的食谱(shell 命令)必须以 TAB 字符开头。您似乎使用的是空格。
  • @reinierpost,错误消息不是表示第 1 行有问题吗?或者这是微软那些迷人的怪癖之一?
  • 不是微软的怪癖。

标签: makefile gnu-make


【解决方案1】:

就个人而言,我在 Windows 上的某个编辑器保存的 Makefile 中遇到了同样的问题。原因是 Makefile 中的 BOM (Byte Order Mark) 使 Make 感到困惑。

要检查是否如此,您可以(手动)将整个 Makefile(或者可能除了标题注释之外)复制并粘贴到在其他编辑器/IDE 中创建的新文件中。这里还有a great answer关于如何在 Windows 上删除 BOM。

【讨论】:

  • Eldar 和 @Beta :请阅读我的 cmets 关于以下两个答案。感谢您的帮助。
【解决方案2】:

如果您的“Makefile.win”是精确副本,则将命令前的所有空格替换为制表符:

全部:$(程序)
在此处插入标签,没有空格>@test -x /usr/bin/strip && strip $^

运行:$(程序)
在此处插入制表符,没有空格>@for p in $(programs);做回声; echo "运行 $$p:"; ./$$p;完成

干净:
在此处插入制表符,没有空格>rm -vf $(programs)
在此处插入制表符,没有空格>rm -vrf *.dSYM

全部运行:
在此处插入制表符,$(programs) 中的 p 没有空格>;做回声“运行$$p”; ./$$p;完成

【讨论】:

  • 我“在”在此处发布问题之前“已经”完成了该操作。但是我不知道这个记事本是如何处理标签的!当我将 makefile 复制到 Linux 并通过 Kwrite 打开它时,我意识到我“再次”必须用新选项卡替换这些选项卡!
【解决方案3】:

LDLIBS 之前的那一行显然是:

config CXXFLAGS)

这会产生一个 makefile 语法错误,但我希望它的行号大于 1。

【讨论】:

  • 谢谢你。这是Windows的“该死”Notepad的错!该死的东西是在第 1 行显示错误。我将 makefile 复制到 Linux 并通过 Kwrite 打开它。然后编译器在“正确的”行号上显示错误。
猜你喜欢
  • 2013-09-26
  • 2023-03-21
  • 1970-01-01
  • 2019-02-06
  • 2022-01-20
相关资源
最近更新 更多