gpt4 book ai didi

linux - Makefile 通配符问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:37:21 25 4
gpt4 key购买 nike

所以我在理解 % 通配符实际如何使用 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.o 构建 a.out(同样地,foo.out 来自 foo.o,以及来自 bar.obar.out,等等),写一个 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 的使用, 和 $^它扩展到先决条件列表,还要注意“*.o”对你没有多大好处。

关于linux - Makefile 通配符问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25586152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com