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

简单的Makefile报告循环依赖关系——可能来自后缀规则?,makefile,gnu-make,circular-dependency,Makefile,Gnu Make,Circular Dependency,我正在使用mingw32-make并试图创建一个简单的规则来运行windres,以包含Windows可执行文件的图标 该结构由a.C中的一个简单C程序和a.rs文件组成,该文件仅包含以下行: 1图标“a.ico” ..图标文件本身和Makefile 生成文件: CC = gcc all: a %.rc.o: %.rc windres $< $@ a: a.o a.rc.o CC=gcc 全部:a %.rc.o:%.rc 温德雷斯美元$@ a:a.o a.rc.o 我

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

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

1图标“a.ico”

..图标文件本身和Makefile

生成文件:

CC = gcc


all: a


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


a: a.o a.rc.o
CC=gcc
全部:a
%.rc.o:%.rc
温德雷斯美元$@
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
>制作
gcc-c-o a.o a.c

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

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

a.rc : ;
或者,如果不需要内置规则来从对象文件创建可执行文件,可以通过添加以下内容来取消:

%: %.o

没有配方。

您已经找到了make关于
.o
的一个隐式规则(我不确定是哪一个),最简单的解决方案就是将
%.rc.o
更改为在末尾有一个不同的文件类型,例如
%.rc.out
。另一个解决方案是删除所有隐式规则,然后自己编写规则。。。在给出如何绕过规则的答案之前,我最终使用了.rs.obj,并且.res也是一个选项(技术上正确,但我不太清楚)。好吧,我想我必须这样做,或者干脆不使用.o。我最终在许多项目中重新定义了excutable->object文件,因此在这些情况下,这将是一个有用的解决方案;否则我会使用像.rc.obj或默许.res。。。