2012-05-27 45 views
0
$(foreach name, $(patsubst lib%.a,%,$(LIBS)), \ 
      $(eval lib$(name).a : lib$(name).a($$($(name)_OBJS)))) 

使上述行失敗說遺漏分隔符。缺失分隔符使錯誤

:68: *** missing separator. Stop. 
+0

我不知道你的問題的答案。你想要的雙重擴展是棘手的。但是,我在Makefile文本中看到了$$。如果您使用GNU Make,您是否調查過'.SECONDEXPANSION'目標? – thb

+0

我得到'***沒有規則來製作目標\ libLIB.a(OBJ.o)',這是'libLIB.a'所需要的。 Stop.' – Neil

+0

此外,您應該可以使用''(LIBS:lib%.a =%)',它比等效的'patsubst'調用短。 – Neil

回答

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) 

所以我們只是需要一個小的修改(使用@尼爾的捷徑和小心處理括號):

# 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)))) 
+0

我會試試這個解決方案! – user1293997

+0

$(eval。)之前有一個空格,爲了避免我只用一行命令。 – user1293997