简单的 Makefile 报告循环依赖——可能来自后缀规则?

Simple Makefile reporting circular dependency -- possibly from suffix rules?

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

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

1 ICON "a.ico"

..图标文件本身和 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 有一个从目标文件 foo.o 构建可执行文件 foo 的内置规则。在您的情况下,make 匹配目标 a.rc.o 的规则 %.rc.o。然后它试图找到一个将更新 a.rc 的规则,当它查找时发现 a.rc.o 将存在,因此它匹配规则 % : %.o,但随后意识到它有一个循环a.rc.o : a.rca.rc : a.rc.o.

的依赖关系

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

a.rc : ;

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

%: %.o

没有食谱。