【问题标题】:Missing Separator Make Error缺少分隔符出错
【发布时间】:2012-05-27 21:03:41
【问题描述】:
$(foreach name, $(patsubst lib%.a,%,$(LIBS)), \
          $(eval lib$(name).a : lib$(name).a($$($(name)_OBJS))))

上一行中的 Make 失败,说缺少分隔符。

:68: *** missing separator.  Stop.

【问题讨论】:

  • 我不知道你的问题的答案。您想要的双重扩展很棘手。但是,我在您的 Makefile 文本中看到了 $$。如果您使用的是 GNU Make,您是否调查过 .SECONDEXPANSION 目标?
  • 我收到*** No rule to make target `libLIB.a(OBJ.o)', needed by `libLIB.a'. Stop.
  • 另外,您应该能够使用比等效的patsubst 调用更短的$(LIBS:lib%.a=%)

标签: makefile


【解决方案1】:

来自the GNUMake manual

要在同一个存档中指定多个成员,您可以编写所有 括号之间的成员名称。例如:

 foolib(hack.o kludge.o)

相当于:

 foolib(hack.o) foolib(kludge.o)

但这似乎不适用于先决条件(GNUMake 3.8.2):

# This works:
     flib: foolib(hack.o) foolib(kludge.o)

# This doesn't:
     flib: foolib(hack.o kludge.o)

所以我们只需要稍作修改(使用@Neil 的快捷方式和对括号的一些小心处理):

# Change this:
$(foreach name, $(LIBS:lib%.a=%), \
  $(eval lib$(name).a : lib$(name).a($$($(name)_OBJS))))


# to this:
lparen := (
rparen := )

$(foreach name, $(LIBS:lib%.a=%), \
  $(eval lib$(name).a : $($(name)_OBJS:%=lib$(name).a$(lparen)%$(rparen))))

【讨论】:

  • $(eval 之前有一个空格。为了避免这种情况,我将命令放在一行中。
猜你喜欢
  • 2010-10-29
  • 1970-01-01
  • 2019-05-07
  • 2016-10-04
相关资源
最近更新 更多