GNU Make:警告:忽略目标`xxx'的旧命令

 可爱的嗨-我喜欢你 发布于 2023-01-20 14:56

你能帮我理解GNU Make(版本3.81)如何处理简单的Makefile吗?这是文件:

.PHONY: a b c e f
a : b c
    @echo "> a(b,c)"
e : a
    @echo "> e(a)"
e : f
    @echo "> e(f)"
f :
    @echo "> f()"
b :
    @echo "> b()"
c :
    @echo "> c()"

现在我运行命令

make e

建立'e'目标.Make的输出如下:

Makefile:7: warning: overriding commands for target `e'
Makefile:5: warning: ignoring old commands for target `e'
> f()
> b()
> c()
> a(b,c)
> e(f)

http://www.gnu.org/software/make/manual/html_node/Error-Messages.html给出了下一个解释:

'警告:覆盖目标`xxx'的配方

'警告:忽略目标`xxx'的旧配方

GNU make只允许为每个目标指定一个配方(双冒号规则除外).如果为已经定义为具有目标的目标提供配方,则会发出此警告,第二个配方将覆盖第一个配方.

但是从输出中我们可以看到构建'a'目标的命令也被执行.我认为根据'Error-Messages'页面中的描述make,在处理这个Makefile并尝试构建'e'目标(make e)时,应该首先确定'e'取决于'a'然后覆盖这个'e'取决于'f'.输出应该如下:

Makefile:7: warning: overriding commands for target `e'
Makefile:5: warning: ignoring old commands for target `e'
> f()
> e(f)

但看起来make仍然记得'e'取决于'a'而不是覆盖配方.

请帮助我理解这种行为.为什么即使在配方覆盖之后,仍然会执行用于构建'a'目标的命令?

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有