【问题标题】:Simple Makefile reporting circular dependency -- possibly from suffix rules?简单的 Makefile 报告循环依赖——可能来自后缀规则?
【发布时间】:2015-03-05 13:34:30
【问题描述】:

我正在使用 mingw32-make 并尝试创建一个简单的规则来运行 windres 以包含 Windows 可执行文件的图标。

该结构由a.c 中的一个简单C 程序、一个仅包含以下行的a.rs 文件组成:

1 ICON "a.ico"

..图标文件本身,以及 Makefile。

Makefile:

CC = gcc


all: a


%.rc.o: %.rc
    windres $< $@


a: a.o a.rc.o

我得到的输出:

>make                      
gcc    -c -o a.o a.c
make: Circular a.rc <- a.rc.o dependency dropped.
windres a.rc a.rc.o
gcc   a.o a.rc.o   -o a

输出文件都创建正确,但我不知道如何编写 .rc->.rc.o 规则来摆脱循环依赖消息。据我所知,它将其解释为suffix rule,其中%.rc.o 表示该规则旨在从%.o 创建%.rc,因此对%.rc 的依赖是循环的...

我可以使用.rco 代替.rc.o,它不会产生此错误,但如果可能,我更喜欢将其保留在复合扩展中。

有没有什么方法可以创建一个模式规则,以 .ext1.ext2 排序的扩展名提供输出,而不会将其解释为后缀规则?

【问题讨论】:

  • 您遇到了 make 对 .o 的隐含规则之一(我不确定是哪一个)最简单的解决方案就是将 %.rc.o 更改为在结尾如%.rc.out。另一种解决方案是删除所有隐式规则并自己编写规则。
  • 似乎...我最终在显示如何绕过规则的答案之前使用 .rs.obj ,并且 .res 始终是一个选项(技术上是正确的,但更少我清楚)

标签: makefile gnu-make circular-dependency


【解决方案1】:

问题在于make 有一个内置规则可以从目标文件foo.o 构建可执行文件foo。在您的情况下,make 匹配目标 a.rc.o 的规则 %.rc.o。然后它试图找到一个将更新a.rc 的规则,当它看到a.rc.o 将存在时,它与规则% : %.o 匹配,但随后意识到它对a.rc.o : a.rc 具有循环依赖关系,并且a.rc : a.rc.o.

最简单的做法是为a.rc 定义一个显式规则,这样它就不会寻找模式规则:

a.rc : ;

或者,如果您不需要内置规则来从目标文件创建可执行文件,您可以通过添加以下内容来取消它:

%: %.o

没有配方。

【讨论】:

  • Welp,我猜我必须这样做,否则就不要在名称中使用 .o。我最终在许多项目中重新定义了可执行文件 -> 目标文件,因此在这些情况下这将是一个有用的解决方案;否则我会像 .rc.obj 一样使用或默认使用 .res...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多