在已经装有Visual Studio 2010的系统中,同时安装Visual Studio 2012,安装过程很顺利,但到使用VS2012时,却出问题了。
本文主要介绍:VS中新建工程编译时出现,“无法打开包括文件:“SDKDDKVer.h”: No such file or directory”问题的解决方法。
一 原因
相关解释见:
http://blog.csdn.net/tianrolin/article/details/29208847
博文主要介绍了VS2012中出现该问题的解决方法,VS2010中解决方法类似。
二 解决方法
VS2010和VS2012包括文件和库文件的宏定义如下:
VS2010:
$(VCInstallDir)include
$(VCInstallDir)atlmfc\include
$(WindowsSdkDir)include
$(VCInstallDir)lib
$(VCInstallDir)atlmfc\lib
$(WindowsSdkDir)lib
VS2012:
$(VCInstallDir)include
$(VCInstallDir)atlmfc\include
$(WindowsSDK_IncludePath)
$(VCInstallDir)lib
$(VCInstallDir)atlmfc\lib
$(WindowsSDK_LibraryPath_x86)
记事本打开:
“C:\Users\Administrator\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props”
(AppData是隐藏文件夹,可以把“C:\Users\Administrator\AppData”复制到文件对话框路径窗口,回车打开,也可以复制到在“开始”搜索中,回车打开)
1. 如果VS2010中出现该问题,在<IncludePath>字段中添加$(WindowsSdkDir)include,在<LibraryPath>字段中添加$(WindowsSdkDir)lib
2.如果VS2012中遇到该问题,在<IncludePath>字段中添加$(WindowsSDK_IncludePath),在<LibraryPath>字段中添加$(WindowsSDK_LibraryPath_x86)
三“转换到 COFF 期间失败: 文件无效或损坏”问题解决
VS安装目录下搜索cvtres.exe,如果安装多个VS会搜索到不止一个cvtres.exe,如果VS2010中出现该问题,可以把VS2012中的cvtres.exe替换VS2010目录下的cvtres.exe,VS2012出现问题用VS2010中的cvtres.exe替换。
VS2010目录:
VS2012目录:
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\cvtres.exe
四 VS2012 " fatal error C1083: 无法打开包括文件:"stdio.h": No such file or directory"
原因:安装过程出现问题,安装目录VC文件夹下的include文件和lib文件,缺少.h和.lib 文件
解决:找到安装目录,默认为:C:\Program Files\Microsoft Visual Studio 11.0\VC
再找一个安装正确的目录,同样找到其安装目录下的VC文件夹,用VC文件夹中的include和lib文件夹,替代自己VC下的include和lib文件夹。1、当保持项目为2010版本(即打开2010的项目,并且不选择更新为2012项目)编译项目时,发生下述链接错误:
LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏。
这是因为与VS 2010配套的cvtres.exe文件版本不正确引起的。使用下面链接中的版本替换Program Files\Microsoft Visual Studio 10.0\VC\bin路径下的同名文件。
http://download.csdn.net/detail/delbboy/4534577
估计是安装VS 2012时,更新了系统中的相关组件,导致VS 2010原有的cvtres.exe失效,如果安装有VS 2010 SP1,则不会出现这个问题,应该是SP1与VS 2012所做的更新兼容。
2、编译VC++项目时,发生下述编译错误:
C1083: 无法打开包括文件:“SDKDDKVer.h”: No such file or directory.
这是因为VS 2012与VS 2010有着不同的Include和Library目录结构,而VS 2012继承了VS 2010的Include和Library搜索目录设置(真不知道M$在想什么),因此编译时找不到相应包含文件和库文件。
解决办法是在头文件的搜索目录中添加$(WindowsSDK_IncludePath);,同时在库文件的搜索目录中添加$(WindowsSDK_LibraryPath_x86); 或 $(WindowsSDK_LibraryPath_x64);,32位系统选择前者,64位系统选择后者。
目前已成功在同一系统中同时使用VS2012、VS2010和VS2008 (VS2010和VS2008都用一阵子,懒得卸载了)。本机安装了两个版本的VS就可能会出现这个编译错误, 比如我机器上同时装了VS2012和VS2008.
VS2012中关于Windows SDK的路径宏定义和VS2008不同,而在某种情况下VS2008的配置串扰到了VS2012.
VS2012继承了VS2008的Include和Library搜索目录设置,,因此编译时找不到相应包含文件和库文件。
解决办法, 在VS2012的头文件的搜索目录中添加$(WindowsSDK_IncludePath);,同时在库文件的搜索目录中添加$(WindowsSDK_LibraryPath_x86);(WindowsSDK_LibraryPath_x64);
可以试试在 INCLUDE 目录增加:$(WindowsSDK_IncludePath)
在 LIB 目录增加:$(WindowsSDK_LibraryPath_x86)
如果是ARM平台或X64平台,用这两个宏:$(WindowsSDK_LibraryPath_arm) 、$(WindowsSDK_LibraryPath_x64)。
以上修改之后应该就可以解决。
SDK7.1 的INCLUDE 路径默认是:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include
SDK8.1 的 INCLUDE 路径默认是:C:\Program Files (x86)\Windows Kits\8.1\Include\um
在结尾多了个 um
C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\winsdkver.h
/* Copyright (c) Microsoft Corporation. All rights reserved. Module Name: WinSDKVer.h Abstract: Master include file for versioning content that ships in the Windows SDK. */ #ifndef _INC_WINSDKVER #define _INC_WINSDKVER #pragma once // This list contains the highest version constants supported by content in the Windows SDK. #define _WIN32_MAXVER 0x0601 #define _WIN32_WINDOWS_MAXVER 0x0601 #define NTDDI_MAXVER 0x0601 #define _WIN32_IE_MAXVER 0x0800 #define _WIN32_WINNT_MAXVER 0x0601 #define WINVER_MAXVER 0x0601
#endif