我有一个看起来像这样的 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”的未定义引用
但是当我第二次运行它时,一切都按预期进行。脚本有什么问题,我们该如何修复它?
之前的回答者给出了很好的答案,但并不完整。那我也发一篇吧。
首先,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)