You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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预处理器的输出解析逻辑不兼容:

  1. windres本身不具备C语法解析能力,编译.rc前会自动调用MinGW配套的GCC对.rc文件做预处理,展开头文件、替换宏定义。
  2. 新版MinGW的GCC在预处理输出的行标记信息中会携带page字段,旧版本windres无法识别该字段,错误将page:判定为待读取的文件路径,触发第一个can't open file 'page:'错误。
  3. 后续的写入失败错误为连锁故障: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 13:09:26