所以我有一些问题需要了解%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规则未定义。如果有人可以解释为什么这是错误的(可能在很多方面,猜测自动变量部分也是不正确的),这将是值得赞赏的!
答案 0 :(得分:3)
我不确定你的意图,但我很确定这条规则:
$(EXEC): %.o
$(CC) -o $(EXEC) $<
没有做到。在这条规则中,&#39;%&#39;不是任何一种通配符,它只是一个角色。因此,当Make尝试构建a.out
时,它会查找名为%.o
的文件,无法找到它,没有规则来构建它(因为没有%.c
1}}并且无法构建那个),并且放弃了。
你的意图不清楚。如果您希望规则能够从a.out
构建a.o
(同样foo.out
来自foo.o
,bar.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