- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个复杂的 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
在上面的示例中,我还将虚假目标的名称更改为 progs
和 libs
,根据我的经验,这更常见。在这种情况下,libs
目标只是为了方便构建所有库,而不是充当实际的依赖项。
关于makefile - 为什么 .PHONY 在这种情况下不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4787686/
我仍然不明白为什么 Makefile 中的“虚假”规则将“.PHONY”作为其目标。作为先决条件,这会更合乎逻辑。 我需要详细说明这一点吗?如果A依赖于B并且B是假的,那么A也是假的。因此,与 .PH
这个问题在这里已经有了答案: What is the purpose of .PHONY in a Makefile? (9 个回答) 关闭 7 年前。 我正在使用生成文件来运行测试。我不确定 .P
考虑一个长 makefile目标众多,都是 PHONY (意味着目标名称不代表现有文件)。 我可以这样做: .PHONY: a a: do someting a .PHONY: b b:
我有一个复杂的 makefile,似乎每次调用它时都会重新链接我的库和可执行文件。我能够将问题缩小到一个简单的 makefile: 1: all: prog 2: 3: .PHONY: prog
我有一个复杂的 makefile,似乎每次调用它时都会重新链接我的库和可执行文件。我能够将问题缩小到一个简单的 makefile: 1: all: prog 2: 3: .PHONY: prog
我有以下递归 makefile: .PHONY: all clean %.subdir: $(MAKE) -C src $* $(MAKE) -C dict $* all: all.s
我有使用 .Phony 的 Makefile,它工作正常 我的问题是有更简洁的方式来编写它而不是在每个目标之前 all: app1 app2 .PHONY: app1 app1: echo "
我正在阅读 make 手册,最后我读到了这一段: Here is how we could write a make rule for cleaning our example editor: cle
在 makefile 中搜索 .PHONY 的用法时,我遇到了 this上面写着类似 .PHONY also allows you to have targets that do not have a
Makefile 中的 .PHONY 是什么意思?我已经经历过this ,但是太复杂了。 有人可以简单地向我解释一下吗? 最佳答案 默认情况下,Makefile 目标是“文件目标” - 它们用于从其他
docs提供: '.EXPORT_ALL_VARIABLES' Simply by being mentioned as a target, this tells 'make' to export a
我已经摸索了大约一个小时了,事实证明 Google 的用途有限。我有一个包含图表的报告的 Makefile。这些图表由 graphs/目录中的 .plot 文件表示,gnuplot 用于从它们生成 .
我有一个Makefile,其中没有目标引用文件,所以如果这可以在某个循环中完成,那就是方便。 是否有某种方法可以将 makefile 中的每个目标设置为 .PHONY ? 我问这个问题的原因是我不想让
我有一个大.PHONY命令: .PHONY: clean cleanall 我可以将其分成多个部分,如下所示吗? .PHONY: clean clean: rm -rf build/ .PHO
我正在将 Makefile 转换为 Shakefile,但我不确定如何处理 PHONY make 目标(clean、install 等)。 )。我尝试过类似的事情: main = shake shak
有人可以阐明这里的区别吗: $(tsdir)/proj 具有先决条件 $(tsdir)/proja 和 $(tsdir)/projb。我希望每次必须构建 proj 时调用 proja 和 projb
一个 makefile 有一个假目标 libs,还有一个要进入的目录 libs。在一台机器上运行良好,而在另一台机器上它不会进入 libs 目标的 libs 目录。在这两种情况下,gnu make 版
我正在尝试让一些依赖安装目标在我的 Makefile 中工作,如下所示: .PHONY: install-everything install-part1 install-part2 install-
我知道 .PHONY 的作用。 如果在我的 Makefile 所在的文件夹中,我添加了一个名为 clean 的空文件,并且在我运行 make clean 之后所有的 clean 目标都不会被执行,因为
.PHONY: b c: a @touch c @echo "Changed" a: b b: @date +%s > a 使用示例 make 文件运行 make 会导致在第一
我是一名优秀的程序员,十分优秀!