gpt4 book ai didi

Makefile 多次编译相同的源代码

转载 作者:行者123 更新时间:2023-12-01 11:07:17 26 4
gpt4 key购买 nike

** 已编辑问题 **

这是一个典型的 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 **

这是解决这个问题的好方法吗(似乎可行...)?

$(TARGET): obj
$(LINKER) $(TARGET) $(LFLAGS) $(OBJECTS)

obj: $(SOURCES) $(INCLUDES)
$(CC) $(CFLAGS) $(SOURCES)

最佳答案

命令$(CC) $(CFLAGS) $(SOURCES)被执行了 n 次,因为 rule 被执行了 n 次,因为有 n 个对象要构建,因为 $(TARGET)规则有那么多对象作为先决条件。如果您希望命令只运行一次,请将所有这些先决条件替换为单个 PHONY先决条件,其规则执行命令。

但没有理由那样做。您可以使命令更具选择性,以便它只构建一个作为实际目标的对象。这样 Make 就不会浪费时间一遍又一遍地重建相同的对象,如果一个或两个源文件被更改,Make 将只重建相关的对象,而不是全部:

$(OBJECTS): %.o : %.c $(INCLUDES)
$(CC) $(CFLAGS) $<

这个规则是保守的——它假定每个对象都依赖于每个 header ,所以它有时会不必要地重建一些东西。如果您知道真正的依赖关系,则可以手动改进,也可以使用更高级的技术自动改进。

编辑:

您的“更新 2”是一个不错的解决方案,但我建议您添加以下行

.PHONY: obj

告诉 Make 不会有名为“obj”的文件。否则 Make 将运行 obj每次都规则,尝试构建该文件。

这仍然存在问题,如果您更改一个源文件,例如foo.c , Make 将重建所有对象。

$<我上面用的是一个automatic variable .意思是“第一先决条件”。因此,当 Make 尝试构建 foo.o 时, 它将评估为 foo.c .

编辑:

Jack Kelly (诅咒他!)指出我对 PHONY 目标的工作方式有误:obj规则将始终运行,TARGET 也将如此。规则,是否有任何源文件已更改。所以“update 2”方法是有效的,但是很粗糙。

关于Makefile 多次编译相同的源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4111494/

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