繁体   English   中英

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

[英]Makefile circular dependency with Windows resource files

关于在运行Makefile时( 此处此处 )删除循环依赖项有几个问题,但是,我对为什么会出现它们有些困惑。

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

CC = gcc
CFLAGS = -mwindows
DEPS = resource.h
OBJ = menu_one.o $(patsubst %.rc,%.rc.o,$(wildcard *.rc))

all: menu_one

%.rc.o: %.rc
    windres $^ -o $@

%.o: %.c $(DEPS)
    $(CC) -c $< -o $@ $(CFLAGS)

menu_one: $(OBJ)
    $(CC) $^ -o $@ $(CFLAGS)

命令$(patsubst %.rc,%.rc.o,$(wildcard *.rc))接收所有以.rc结尾的资源文件,并在文件上加上.o扩展名(例如, resource.rc.o )。

当我运行此命令时,一切似乎都可以正常工作,并且可以正常运行,但是,Make输出以下内容:

gcc -c menu_one.c -o menu_one.o -mwindows
make: Circular menu_one.rc <- menu_one.rc.o dependency dropped.
windres menu_one.rc -o menu_one.rc.o
gcc menu_one.o menu_one.rc.o -o menu_one -mwindows

因为我在技术上有两个.o规则,所以发生这种循环依赖吗? 换句话说, 如何纠正这种循环依赖性?


编辑1:

我尝试按照@MadScientist的说法进行操作,但是,这仍然与Make产生了循环依赖关系 经过更多谷歌搜索之后,我遇到了下一页 在最底部,有一个标题为“ 循环文件依赖项 ”的部分。 这让我考虑了Make的输出:

make: Circular menu_one.rc <- menu_one.rc.o dependency dropped.

看起来rc后缀正在创建此依赖关系-即使它不是输出目标文件(即file.rc.o )的文件扩展名的一部分。 如果将输出文件后缀更改为.res.o ,则循环依赖关系将完全消失:

...
RESOBJ = $(patsubst %.rc,%.res.o,$(wildcard *.rc))
OBJ = menu_one.o $(RESOBJ)
...
%.res.o: %.rc
    windres $^ -o $@
...

如果我想使用前面的后缀.rc.o这会引发一个非常类似的问题, 您将如何实现? 可能吗?

编辑2:

@MadScientist提出的使用任何匹配规则的建议可以完美地解决问题。 现在,这使我可以使用.rc.o后缀结尾。 请参阅下面的@MadScientist更新后的答案。

一种方法是不以.o扩展名命名windres输出文件。 如果您选择其他扩展名,则不会有此问题。

另一种方法是对windres目标使用静态模式规则

RCOBJ := $(patsubst %.rc,%.rc.o,$(wildcard *.rc))
OBJ = menu_one.o $(RCOBJ)

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

由于静态模式规则是创建显式规则的缩写,并且不是隐式规则,因此它们不参与搜索,因此make不会产生循环依赖关系。

ETA

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

%: %.o ; ...

此模式匹配与目标menu_one.rc给人的先决条件menu_one.rc.o ,和你有一个循环。

您需要做的是通知make *.rc文件是源文件,并且make不应尝试构建它们。 您可以通过声明终止规则来执行此操作。 在GNU make手册中,全面讨论了处理任何匹配规则 (仅目标为%规则,该目标与任何目标均匹配)的复杂性。

添加以下内容以通知使您的.rc文件处于终端状态(即,它们不能由其他内容构建):

%.rc:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM