多次编译相同源的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