Make:使用所有目标文件的通配符

Ano*_*ity 4 makefile

我有一个看起来像这样的 Makefile:

CC=cc
CFLAGS=-g -std=c99 -Wfatal-errors
OBJS=$(wildcard *.o)

all: main.o cmdargs.o io.o
    $(CC) -o app $(OBJS)

main.o: main.c
    $(CC) -c main.c $(CFLAGS)
cmdargs.o: cmdargs.c
    $(CC) -c cmdargs.c $(CFLAGS)
io.o: io.c
    $(CC) -c io.c $(CFLAGS)

clean:
    @rm -rf app $(OBJS)
Run Code Online (Sandbox Code Playgroud)

每当我make all在干净之后运行时,都会出现错误

抄送-o

对“main”的未定义引用

但是当我第二次运行它时,一切都按预期进行。脚本有什么问题,我们该如何修复它?

Mar*_*eck 5

之前的回答者给出了很好的答案,但并不完整。那我也发一篇吧。

首先,wildcard在 makefile 中使用是一个坏主意。最好不要偷懒并明确列出您的文件。

如果你一定要偷懒,使用的方法wildcard就是,正如 shawncorey 所写的那样,将它用作源。

另外,不要有虚假目标的配方,例如all. 在您的示例中,配方all将始终运行,这是低效的。

CC := gcc

SRCS := $(wildcard *.c)
OBJS := $(SRCS:c=o)

.PHONY: all clean

all: app 

app: $(OBJS) Makefile
    $(CC) -o $@ $(OBJS)

$(OBJS): %.o: %.c Makefile
    $(CC) -c $< $(CFLAGS)

clean:
    @rm -rf app $(OBJS)
Run Code Online (Sandbox Code Playgroud)