在将旧的C ++项目从Visual Studio 6迁移到Visual Studio 2012时,我们在标准Microsoft平台标头内部发现了一组奇怪的警告:
在线搜索只发现其他一些人遇到此错误。在某些情况下,人们试图使用VS2012来编译传统的DirectX代码 - 我没有这样做。在其他情况下,人们试图使用VS2012来定位Windows XP(使用Update 1中的新选项) - 我正在这样做。
DirectX问题得到了回答,警告将始终告诉您,您正在使用过时的(Win8之前版本)版本编译,而您只需要使用它。
Windows XP问题没有得到解答。其他人只是说他们无法重现这个问题。
我复制了它,并找到了原因,我在这里写这篇文章是为了帮助遇到此事的其他人。
答案 0 :(得分:19)
进入项目属性,找到“预处理器定义”字段。
除了默认和添加的定义常量之外,您还应该看到一个宏:
%(PreprocessorDefinitions)
这个宏显然带来了一些额外的编译器提供的预处理器定义。我不确定哪个版本的Visual Studio引入了这个宏,但它在Visual Studio 6中不存在。
在Visual Studio 2012中,此宏 required 将出现在项目的预处理程序定义字段中。在早期版本的Visual Studio中也可能需要它,但我还没有对它们进行测试。
如果缺少此宏,您将看到如上所示的错误消息。
答案 1 :(得分:12)
更新:
首先查看Edmund的answer to this same question - 尝试一下。如果它工作,太棒了!如果不是......请尝试以下方法:
ORIGINAL:
使用此网页“工作区”标签中提到的解决方法:
即,添加:
#define _USING_V110_SDK71_ 1
...直接在.rc文件之前它包含任何包含导致此警告的系统标题的内容。
答案 2 :(得分:11)
在网上任何地方都没有找到解决方案,所以这对我有用。
我正在使用110_xp工具构建项目
我收到这些警告......
c:\program files (x86)\microsoft sdks\windows\v7.1a\include\sal_supp.h(57): warning C4005: '__useHeader' : macro redefinition
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\sal.h(2872) : see previous definition of '__useHeader'
c:\program files (x86)\microsoft sdks\windows\v7.1a\include\specstrings_supp.h(77): warning C4005: '__on_failure' : macro redefinition
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\sal.h(2882) : see previous definition of '__on_failure'
显然VC 11标头和7.1a sdk标头之间存在不一致。
在我的stdafx.cpp中我这样做了......
#define _USING_V110_SDK71_
#include "stdafx.h"
......构建问题已经消失。
答案 3 :(得分:6)
这是资源编译器警告。解决方案很简单。右键单击解决方案资源管理器中的.rc文件,然后选择“属性”。现在转到资源>一般>预处理器定义,并添加
%(PreprocessorDefinitions)
答案 4 :(得分:4)
对我来说,另一种解决方案有效。
在项目属性→配置属性→ C / C ++ →常规中,我更改了字段使用此宏添加包含目录 SDK的路径:
$(WindowsSDK_IncludePath)
在此之前,这个字段有我的SDK v7.1的路径,我有相同的警告。
答案 5 :(得分:3)
如果您的cpp文件没有预编译的标头,则在Stdafx.cpp或Stdafx.h中添加#define _USING_V110_SDK71_
将无效。
要解决此问题,请执行以下操作。
在解决方案资源管理器中右键单击项目*→属性→ C / C ++ →预处理器→预处理器定义 →编辑→添加_USING_V110_SDK71 _
答案 6 :(得分:2)
它仍然更简单。
只需选中&#34;继承自父项目或项目默认值&#34; 配置属性→ C / C ++ →< em>预处理器/预处理器定义→编辑。
答案 7 :(得分:1)
对于我来说,这发生在Visual Studio 2017(新安装和修复安装)上。显然,Windows 7.1 SDK已在VS2017之前安装,并已集成到Visual Studio 2005安装中。
在我的情况下,这两个文件:
%LOCALAPPDATA%\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props
%LOCALAPPDATA%\Microsoft\MSBuild\v4.0\Microsoft.Cpp.x64.user.props
包含对Windows 7.1 SDK的include目录和库的引用。删除这些引用完成了这项工作。
请记住,Win32和x64的每个C ++项目都分别继承自这些属性表。
答案 8 :(得分:0)
我在一些源自VC ++ 2003并且多年来逐步升级的项目中遇到了这个问题。我发现虽然项目设置在预处理器定义中有%(PreprocessorDefinitions)
,但是一些.cpp文件没有(最老的)。将它们更改为&#34;继承父项或项目默认值&#34;它摆脱了警告。
答案 9 :(得分:0)
尽管这个答案适用于VS10,但它可能会提供一些关于VC ++目录宏发生了什么的线索: 当这些语句添加到项目的头文件MyApp中时出现警告:
#ifndef NTDDI_WINXPSP3
#define NTDDI_WINXPSP3 0x05010300
#endif
#ifndef NTDDI_VISTA
#define NTDDI_VISTA 0x06000000
#endif
#ifndef NTDDI_VISTASP1
#define NTDDI_VISTASP1 0x06000100
#endif
#ifndef NTDDI_WS08
#define NTDDI_WS08 0x06000100
#endif
除了XPSP3 def。:
之外,所有警告都会弹出警告RC4005:&#39; NTDDI_VISTASP1&#39; :重新定义C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.0A \ include \ sdkddkver.h ..,MyApp
MyApp是一个WinDebug 32版本,注意到Windows 7.1SDK出现在proj文件的X64部分中:
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<PlatformToolset>Windows7.1SDK</PlatformToolset>
预处理程序定义的继承值为_VC80_UPGRADE = 0x0600。在恢复到V100之前使用SDK工具集后,SDK库在的包含目录和库目录中的 inherited_from 中找到VC ++目录部分,如上所述here
看起来警告是由升级,迁移或工具集更改的组合生成的。
修改:VS2017(MBCS)中的无关问题选择使用
LoadCursorW(nullptr, IDC_ARROW)
而不是WNDCLASSEXW结构中的默认LoadCursorA(...)
。一个可能的解决方案是重新定义如下:
#define IDC_ARROW MAKEINTRESOURCEW(32512)
此处可以使用#define
之前的#undef
procedure来抑制警告:
#ifdef IDC_ARROW
#undef IDC_ARROW
#endif
#define IDC_ARROW MAKEINTRESOURCEW(32512)
答案 10 :(得分:0)