多次编译相同源的Makefile
**问题已编辑** 下面是一个典型的多次编译相同源的Makefile,makefile,Makefile,**问题已编辑** 下面是一个典型的Makefile模板: TARGET = my_prog # project name CC = gcc -o CFLAGS = -Wall SOURCES := $(wildcard *.c) INCLUDES := $(wildcard *.h) OBJECTS := $(SOURCES:.c=*.o) rm = rm -f $(TARGET): $(OBJECTS) @$(CC)
Makefile
模板:
TARGET = my_prog # project name
CC = gcc -o
CFLAGS = -Wall
SOURCES := $(wildcard *.c)
INCLUDES := $(wildcard *.h)
OBJECTS := $(SOURCES:.c=*.o)
rm = rm -f
$(TARGET): $(OBJECTS)
@$(CC) $(TARGET) $(CFLAGS) $(SOURCES)
@echo "Compilation complete!"
clean:
@$(rm) $(TARGET) $(OBJECTS)
@echo "Cleanup complete!"
问题:为什么在调用make
时第11行(@S(CC)$(TARGET)
)仍在回响
答:因为问题在默认规则中,第11行可以
**更新**
我现在有了这个Makefile
# project name
TARGET = my_prog
CC = gcc -c
CFLAGS = -Wall -I.
LINKER = gcc -o
LFLAGS = -Wall
SOURCES := $(wildcard *.c)
INCLUDES := $(wildcard *.h)
OBJECTS := $(SOURCES:.c=*.o)
rm = rm -f
$(TARGET): $(OBJECTS)
$(LINKER) $(TARGET) $(LFLAGS) $(OBJECTS)
$(OBJECTS): $(SOURCES) $(INCLUDES)
$(CC) $(CFLAGS) $(SOURCES)
clean:
$(rm) $(TARGET) $(OBJECTS)
问题:为什么执行$(CC)$(CFLAGS)$(SOURCES)
次n,其中n是源文件的数量
**更新2**
这是解决这个问题的好方法吗(似乎有效…)
我认为输出来自生成.o文件,而不是我的程序 看起来您没有创建.o文件的规则,因此make使用的是默认规则 试着说:
@echo "starting compilation"
在第11行生成命令之前的行上
您可以看到,“开始编译”是在gcc行之后输出的
或许第10行应该改为:
$(TARGET): $(SOURCES)
?命令$(CC)$(CFLAGS)$(SOURCES)
执行n次,因为规则执行n次,因为要生成n个对象,因为$(TARGET)
规则有那么多对象作为先决条件。如果希望命令只运行一次,请将所有这些先决条件替换为单个PHONY
先决条件,其规则执行命令
但是没有理由这样做。您可以使命令更具选择性,以便它只生成一个作为实际目标的对象。这样,Make就不会浪费时间反复重建相同的对象,如果一个或两个源文件已更改,Make将只重建相关对象,而不是全部对象:
$(OBJECTS): %.o : %.c $(INCLUDES)
$(CC) $(CFLAGS) $<
告诉Make没有名为“obj”的文件。否则Make每次都会运行obj
规则,试图构建该文件
这仍然存在一个问题,即如果更改一个源文件,例如foo.c
,Make将重新生成所有对象
$+1我觉得有趣的是,你可以用一个简单的工具获得这么多不同的结果。。。现在开始工作了!但它不再创建任何.o文件。我并不介意…如果你愿意,你可以制作对象文件。只是如果你想让它们安静下来,你必须制定一个规则来构建它们them@Beta,GNU。我在运行Linux是的,我能看到问题。(参见我的“更新2”)。顺便说一句:<代码>$你现在正式成为我的死敌。你总是第一个来到这里,并给出一个几乎无懈可击的答案:-)。我会犹豫是否使用“更新2”样式,因为一旦您制作了obj
phony,它将在每次运行make
时重新链接make
设计用于跟踪文件,所以就让它跟踪文件吧!
$(OBJECTS): %.o : %.c $(INCLUDES)
$(CC) $(CFLAGS) $<
.PHONY: obj