Makefile通配符问题

时间:2014-08-30 19:47:08

标签: linux compilation makefile gnu

所以我有一些问题需要了解%wildcard实际上如何使用makefile。我已经看过GNU make man中的静态模式规则,但我仍然很困惑,我觉得我已经看到他们做了类似于我下面的事情。

EXEC = a.out
CC = gcc
FLAGS = -Wall -c

$(EXEC): %.o
    $(CC) -o $(EXEC) $<
%.o: %.c
    $(CC) $(FLAGS) $<

clean:
    rm -rf *.o

我一直收到一条错误,指出%.o规则未定义。如果有人可以解释为什么这是错误的(可能在很多方面,猜测自动变量部分也是不正确的),这将是值得赞赏的!

2 个答案:

答案 0 :(得分:3)

我不确定你的意图,但我很确定这条规则:

$(EXEC): %.o
    $(CC) -o $(EXEC) $<

没有做到。在这条规则中,&#39;%&#39;不是任何一种通配符,它​​只是一个角色。因此,当Make尝试构建a.out时,它会查找名为%.o的文件,无法找到它,没有规则来构建它(因为没有%.c 1}}并且无法构建那个),并且放弃了。

你的意图不清楚。如果您希望规则能够从a.out构建a.o(同样foo.out来自foo.obar.out来自bar.o,等等),写一个pattern rule

%.out: %.o
    $(CC) -o $@ $<

$(EXEC): # Make will not use a pattern rule as the default, so we need this

(请注意使用$@。)或(将其限制为EXEC列表中的可执行文件)static pattern rule

$(EXEC): %.out : %.o
    $(CC) -o $@ $<

另一方面,如果您希望Make使用它可以找到的所有源文件来构建此可执行文件,您必须执行以下操作:

SOURCES = $(wildcard *.c) # make a list a.c foo.c bar.c
OBJECTS = $(patsubst %.c, %.o, $(SOURCES)) # translate it into a.o foo.o bar.o
$(EXEC): $(OBJECTS)
    $(CC) -o $^ $<

请注意使用扩展到先决条件列表的the wildcard function$^,并注意&#34; *。o&#34;不太好。

答案 1 :(得分:1)

很久以前我常常使用makefile,看起来更像下面。对于每个可执行文件,我们明确列出了所需的目标文件。

CC = gcc
FLAGS = -Wall -c

prog1:    mod1.o mod2.o
    $(CC) mod1.o mod2.o -o prog1

prog2:    mod1.o mod3.o
    $(CC) mod1.o mod3.o -o prog2

%.o: %.c
    $(CC) $(FLAGS) $<

clean:
    rm -rf *.o