MinGW环境下windres无法编译.rc资源文件报错如何解决
MinGW环境下windres编译.rc文件报
can't open file 'page:'错误的原因与修复 问题场景
- 开发栈:C + Win32 API 开发桌面应用,构建工具使用CMake/Make,工具链为MinGW,接入.rc资源文件前全流程运行正常
- 预期资源编译流程:编写.rc脚本 → 编译生成.res二进制资源文件 → 链接阶段嵌入最终可执行文件
- 故障表现:所有.rc文件调用windres编译均失败,返回错误信息:
C:\ProgramData\chocolatey\lib\mingw\tools\install\mingw64\bin\windres.exe: can't open file `page:': Invalid argument C:\Code\C\test\resources.rc:4: fatal error: when writing output to : No such file or directory 4 | IDI_TEST_ICON ICON "test.ico" | compilation terminated. C:\ProgramData\chocolatey\lib\mingw\tools\install\mingw64\bin\windres.exe: preprocessing failed.
- 测试用最小复现文件:
resources.rc内容:#include <windows.h> #include "resource.h" IDI_TEST_ICON ICON "test.ico"resource.h内容:#define IDI_TEST_ICON 101 - 已尝试操作:将.rc文件从UTF-8编码转为ANSI编码,故障未消除。
根本原因
该故障和.rc文件编码无关,核心是windres与配套GCC预处理器的输出解析逻辑不兼容:
- windres本身不具备C语法解析能力,编译.rc前会自动调用MinGW配套的GCC对.rc文件做预处理,展开头文件、替换宏定义。
- 新版MinGW的GCC在预处理输出的行标记信息中会携带
page字段,旧版本windres无法识别该字段,错误将page:判定为待读取的文件路径,触发第一个can't open file 'page:'错误。 - 后续的写入失败错误为连锁故障:windres解析预处理器输出异常后,无法生成合法的临时输出路径,导致.res文件写入流程直接中断。
chocolatey源分发的MinGW经常出现binutils(含windres)与GCC版本不匹配的问题,是该故障的高发场景。
修复方案
按优先级从高到低尝试以下方案:
- 方案1:编译时显式指定预处理器参数,屏蔽不兼容的行标记输出
调用windres时追加参数,指定GCC预处理阶段不生成行标记信息,从根源避免解析错误,示例编译命令:
其中*windres resources.rc -O coff -o resources.res --preprocessor "gcc -E -xc -DRC_INVOKED -P"-P是核心参数*,作用是告知GCC预处理时跳过行号标记生成。如果使用CMake构建,直接将该参数追加到CMAKE_RC_FLAGS配置项即可。 - 方案2:更换版本匹配的MinGW发行版
卸载当前通过chocolatey安装的MinGW,更换为winlibs等做过版本兼容性校验的MinGW发行版,保证windres与GCC版本适配,无需额外参数即可正常编译。 - 方案3:排查临时目录路径问题
检查系统TEMP、TMP环境变量指向的路径,若路径包含中文、空格、特殊字符,将其修改为无空格无特殊字符的纯英文路径(如C:\Temp),重启终端后重新编译即可。
内容的提问来源于stack exchange,提问作者Jack Henrikson
相关产品推荐
相关产品推荐

