gpt4 book ai didi

makefile - 为什么 .PHONY 在这种情况下不起作用?

转载 作者:行者123 更新时间:2023-12-02 17:53:33 28 4
gpt4 key购买 nike

我有一个复杂的 makefile,似乎每次调用它时都会重新链接我的库和可执行文件。我能够将问题缩小到一个简单的 makefile:

 1: all: prog
2:
3: .PHONY: prog
4: prog: prog.exe
5:
6: prog.exe: lib prog.o
7: touch prog.exe
8:
9: prog.o: prog.c
10: touch prog.o
11:
12: .PHONY: lib
13: lib: lib.so
14:
15: lib.so: lib.o
16: touch lib.so
17:
18: lib.o: lib.c
19: touch lib.o
20:
21: .PHONY: clean
22: clean:
23: rm *.so *.o *.exe

出于某种原因,此示例每次都会创建 prog.exe。如果我用 lib.so 替换第 6 行的 lib,那么它就可以工作。然而,似乎我应该能够做我在这里尝试的事情。我缺少一些基本的东西吗?

最佳答案

摘自在线 GNU make 手册:

A phony target should not be a prerequisite of a real target file; if it is, its recipe will be run every time make goes to update that file. As long as a phony target is never a prerequisite of a real target, the phony target recipe will be executed only when the phony target is a specified goal (see Arguments to Specify the Goals).

这至少解释了你所看到的。由于 prog.exe 依赖于 lib(您收集库的虚假目标),因此会触发 lib 规则,因此 prog.exe 已“过时”,并会重新链接。

看来您必须更明确地了解您的依赖关系。也许您有兴趣将它们放入变量中以使管理多个库更容易一些?例如:

LIBS = lib.so

all: libs progs

.PHONY: progs libs clean

progs: prog.exe

prog.exe: $(LIBS) prog.o
touch prog.exe

# etc.
libs: $(LIBS)

lib.so: lib.o
touch lib.so

# and so on

在上面的示例中,我还将虚假目标的名称更改为 progslibs,根据我的经验,这更常见。在这种情况下,libs 目标只是为了方便构建所有库,而不是充当实际的依赖项。

关于makefile - 为什么 .PHONY 在这种情况下不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4787686/

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