与Windows资源文件的Makefile循环依赖关系

与Windows资源文件的Makefile循环依赖关系,makefile,circular-dependency,win32gui,windres,Makefile,Circular Dependency,Win32gui,Windres,在运行Makefile时,有几个关于循环依赖关系被删除的问题,但是,我仍然有点困惑为什么会发生循环依赖关系 例如,我试图编译一个包含资源文件的Win32 GUI程序。这些资源文件通过windres命令编译为目标文件,因此它们可以链接到最终的可执行文件: 这种循环依赖是否是因为技术上我有两个.o规则?换句话说,我如何纠正这种循环依赖关系 编辑1: 我试着按照上面所说的做,但是,这仍然创建了一个与Make的循环依赖关系。在谷歌搜索了一些之后,我发现了。在最底部有一个标题为循环文件依赖项的部分。这让我

在运行Makefile时,有几个关于循环依赖关系被删除的问题,但是,我仍然有点困惑为什么会发生循环依赖关系

例如,我试图编译一个包含资源文件的Win32 GUI程序。这些资源文件通过windres命令编译为目标文件,因此它们可以链接到最终的可执行文件:

这种循环依赖是否是因为技术上我有两个.o规则?换句话说,我如何纠正这种循环依赖关系

编辑1: 我试着按照上面所说的做,但是,这仍然创建了一个与Make的循环依赖关系。在谷歌搜索了一些之后,我发现了。在最底部有一个标题为循环文件依赖项的部分。这让我想到了Make的输出:

make: Circular menu_one.rc <- menu_one.rc.o dependency dropped.
这引发了一个非常类似的问题,如果我想使用前面的后缀.rc.o,您将如何实现这一点?可能吗

编辑2:
他提出的使用a的建议很好地解决了这个问题。这现在允许我使用.rc.o后缀结尾。请参阅下面的更新答案。

一种方法是不使用.o扩展名命名windres输出文件。如果选择不同的扩展,则不会出现此问题

另一种方法是用于windres目标:

因为静态模式规则是创建显式规则的简写,而不是隐式规则,所以它们不参与搜索,所以make不会产生循环依赖

埃塔

好的,我在本地创建了您的示例。使用make-d,我们可以看到发生了什么:make需要构建menu_one.rc.o,它使用menu_one.rc的先决条件找到我们的规则。然后,它需要查看是否可以重建manu_one.rc,并找到构建可执行文件的通用模式规则:

%: %.o ; ...
将此模式与menu_one.rc的目标相匹配将提供menu_one.rc.o的先决条件,并且您有一个循环

您需要做的是通知make*.rc文件是源文件,make不应该尝试构建它们。您可以通过声明终端规则来实现这一点。有一个关于处理目标为%的规则的复杂性的综合讨论,该目标与GNU make手册中的任何目标相匹配

添加此项以告知make您的.rc文件是终端文件,即不能从其他文件构建它们:

%.rc:

我添加了新变量RCOBJ,并为$RCOBJ文件列表添加了静态模式规则,但是,我仍然得到一个循环依赖性错误。我确实删除了%.rc.o:%.rc规则,但保留了%.o:%.c$DEPS规则和menu_one:$OBJ规则。我遗漏了什么吗?我在下面更新的答案中讨论了为什么您会收到此循环参考文件make正在做什么以及如何解决它。干杯
...
RESOBJ = $(patsubst %.rc,%.res.o,$(wildcard *.rc))
OBJ = menu_one.o $(RESOBJ)
...
%.res.o: %.rc
    windres $^ -o $@
...
RCOBJ := $(patsubst %.rc,%.rc.o,$(wildcard *.rc))
OBJ = menu_one.o $(RCOBJ)

  ...
$(RCOBJ) : %.rc.o : %.rc
        windres $^ -o $@
%: %.o ; ...
%.rc: