Visual Studio 2013生成的Resource.rc含winres.h编译问题咨询
关于Resource.rc中
#include "winres.h"的常见问题与编译解决办法 我来帮你理清楚关于#include "winres.h"的几个核心问题,顺便解决你编译失败的困扰:
为什么Resource.rc里会自动出现这个语句?
winres.h是Visual Studio为资源脚本(.rc文件)提供的标准辅助头文件,VS在生成资源文件时自动加上它,主要有两个作用:
- 预定义了大量Windows资源相关的宏、类型和常量,比如默认的对话框ID(
IDD_DIALOG)、菜单ID、资源类型标识,还有资源编译时依赖的通用数据结构,不用你手动去一个个定义或者引用零散的SDK头文件。 - 帮你自动关联Windows SDK里的核心资源定义,简化资源脚本的编写逻辑,避免因为头文件引用不全导致的编译错误。
winres.h文件的默认位置
这个文件是VS和Windows SDK配套安装的,针对VS2013,常见路径有两个:
- 如果是VS自带的ATL/MFC组件提供的:
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\include\winres.h(VS2013的版本号是12.0,路径可能因你安装盘符、自定义位置略有不同) - 来自独立Windows SDK的:
C:\Program Files (x86)\Windows Kits\8.1\Include\um\winres.h(VS2013通常默认搭配Windows 8.1 SDK)
这个文件是必需的吗?
分两种情况看:
- 如果你用的是VS自动生成的资源(比如默认对话框、菜单、图标等),或者资源脚本里用到了它定义的宏/类型,那绝对是必需的——删掉它会直接导致编译时找不到这些预定义内容,报标识符未定义的错误。
- 如果你的资源脚本完全是手写的,没有用到任何它提供的内容,理论上可以删掉,但非常不建议这么做——它是Windows资源编译的标准辅助文件,保留它能避免很多兼容性问题。
解决编译失败的具体步骤
你的程序因为这个头文件编译失败,大概率是VS的包含路径配置出问题了,可以按以下顺序排查:
- 右键你的项目 → 属性 → 配置属性 → 资源 → 常规 → 附加包含目录,检查是否添加了winres.h所在的路径(比如上面提到的VC\atlmfc\include或者Windows SDK的Include路径)。
- 确认你的VS2013安装完整:如果是精简安装,可能漏掉了ATL/MFC组件或者Windows SDK,需要打开VS安装程序选择“修复”来补全。
- 检查资源脚本里的引用格式:如果写成了
#include <winres.h>,可以改成#include "winres.h"试试;或者确保系统包含路径里已经包含了这个文件的所在目录。 - 临时应急方案:如果实在找不到文件,可以从其他正常安装的VS2013里复制winres.h到你的项目根目录,然后用
#include "winres.h"引用,但这只是权宜之计,最好还是修复路径配置。
内容的提问来源于stack exchange,提问作者user8024280




