因此,我在理解 % 通配符如何使用 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 规则未定义。如果有人可以解释为什么这是错误的(可能在很多方面,猜测自动变量部分也是错误的),我们将不胜感激!
最佳答案
我不确定你的意图,但我很确定这条规则:
$(EXEC): %.o
$(CC) -o $(EXEC) $<
不这样做。在此规则中,“%”不是任何类型的通配符,它只是一个字符。所以当 Make 尝试构建 a.out
时,它会寻找一个名为 %.o
的文件,找不到它,没有构建它的规则(因为没有 %.c
并且无法构建那个),然后放弃。
你的意图不清楚。如果你希望规则能够构建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
列表中的可执行文件)a 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 的使用,和 $^它扩展到先决条件列表,还要注意“*.o”不会给你带来多大好处。
关于linux - Makefile 通配符问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25586152/