gpt4 book ai didi

c - Makefile 每次编译

转载 作者:行者123 更新时间:2023-12-01 13:40:59 24 4
gpt4 key购买 nike

我刚开始在我的大学学习 C 编程语言。我们的任务是创建一个使用可执行程序的 Makefile(在我的例子中是战斗),并且只在必要时编译。我的问题是每次我使用 make 命令时它都会编译,并且它没有像我想要的那样显示“是最新的”。我有 2 个对象要编译(quest.o 和 thorgrim.o,只有 quest.o 必须创建,因为我们已经有了 thorgrim.o)到“战斗”中。这是我的代码:

CC=gcc
EXE=battle
CFLAGS=-Wall

build: run
run: quest.o
$(CC) $^ thorgrim.o -o $(EXE)
./$(EXE)
quest.o: quest.c
$(CC) -c $^ -o $@
clean: rm -rf quest.o $(EXE)

我究竟做错了什么?如果我不接触 quest.c,我希望它编译一次,然后显示为最新的。

最佳答案

鉴于您是新手,我将引导您完成它,这样您就可以第一次学会正确地做这件事。有很多小细节,很多人最终都错过了,所以希望这能给你一个很好的引用:

首先,让我们从定义你的对象开始

OBJS := quest.o thorgrim.o

您现在可以创建模式规则:
%.o: %.c
$(CC) $(CFLAGS) -MD -MP $< -c -o $@

这条规则的第一行 %.o:%.c表示以 .o 结尾的任何内容依赖于以 .c 结尾的同名文件.这样做可以避免您为每个目标文件编写单独的规则。请注意,有一个默认的模式规则来实现这种效果,但我们不会在这里讨论。

接下来,您调用 $(CC)$(CFALGS) .请注意 $@现在代表您正在生成的 .o 文件的名称, $<表示对象的第一个依赖项(在本例中为 .c 文件)。
-MD-MP用于自动生成依赖文件 -- 对于每个 .c文件它还将创建一个 .d文件,其中列出了您的源代码构建所需的依赖项( .h 文件)。您必须 -include使其工作的依赖文件。 (查看 https://gcc.gnu.org/onlinedocs/gcc-4.3.1/gcc/Preprocessor-Options.html 了解更多关于这些功能的详细信息)。这样,如果你修改了一个头文件,它会自动重建必要的 .o文件。话虽如此,您必须在 makefile 中包含这些 .d 文件:
-include $(OBJS:.o=.d)

这将包括 .d 文件,就好像有人将代码剪切并粘贴到您的 makefile 中一样。 $(OBJS:.o=.d)简单地告诉 make 使用变量 OBJS并替换所有 .o.d的。注意 -在包含之前。如果文件不存在,这告诉 make 不要担心(就像您第一次构建时的情况......)。

好的,既然您已经构建了 .o 文件,您需要构建您的程序:
$(EXE): $(OBJS)
$(CC) $^ -o $@

添加默认规则和注释,您就完成了。因此,总而言之,您的 makefile 将如下所示:
CC:=gcc
EXE:=battle
CFLAGS:=-Wall
OBJS:=quest.o thorgrim.o

%.o: %.c
$(CC) $(CFLAGS) -MD -MP $< -c -o $@

$(EXE): $(OBJS)
$(CC) $^ -o $@

clean:
rm -f $(OBJS) $(EXE)

-include $(OBJS:.o=.d)

编辑:忘记了干净的规则——添加。

关于c - Makefile 每次编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40288915/

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