如何针对 windows 8.1 SDK 进行构建

How to build against the windows 8.1 SDK

我的设置如下:

Windows 8.1,微软 Visual Studio 2012

我希望针对 Windows 8.1 SDK 进行构建。我的应用程序是 C++,没有 windows 运行时组件或类似的东西。

我安装了 windows 8.1 SDK,但 Visual Studio 是针对 Windows 7 SDK 构建的,因此为了切换目标,我修改了指向当前 SDK 版本的注册表项:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows

然而,当我检查 Visual Studio 中的宏时,它现在是针对 windows SDK 8.0 而不是 8.1.

构建的

谁能解释为什么会这样?我无法使用我的设置针对 windows 8.1 SDK 进行构建,是否无法使用 Visual Studio 2012?我找不到任何决定性的信息来告诉我是否支持它。

怎么回事

WindowsSdkDir 是一个 Visual Studio 内部变量,它是从基于 "Platform Toolset" 项目 属性(在 "Configuration Properties / General" 下)的注册表项派生的。对于 "Visual Studio 2012 (v110)" 平台工具集,注册表项如:

HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v8.0
HKCU\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v8.0
HKLM\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v8.0
HKCU\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v8.0

被使用,与 CurrentVersionCurrentInstallFolder 键无关。

如何使用 Visual Studio 2012

针对 Windows 8.1 SDK 进行构建

this blog所述:

VS 2010/2012 users: You can use the property sheet technique for the Windows 8.1 SDK that was described in this Visual C++ Team blog post originally for VS 2010+Windows 8.0 SDK. For VS 2010, just change the part of the paths with "8.0"/"win8" to "8.1"/"winv6.3" but otherwise use all those instructions. For VS 2012, you can simplify all the paths to just add the 8.1 paths before the existing value for each variable. The updated .props are attached to this blog post. This should only be used for Win32 desktop application development.

进行这些更改后,您应该得到一个 属性 sheet(它也作为 same blog 的附件提供),对于 x86,它看起来像:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ImportGroup Label="PropertySheets" />
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup>
    <ExecutablePath>$(ProgramFiles)\Windows Kits.1\bin\x86;$(ExecutablePath)</ExecutablePath>
    <IncludePath>$(ProgramFiles)\Windows Kits.1\Include\um;$(ProgramFiles)\Windows Kits.1\Include\shared;$(ProgramFiles)\Windows Kits.1\Include\winrt;$(IncludePath)</IncludePath>
    <LibraryPath>$(ProgramFiles)\Windows Kits.1\lib\winv6.3\um\x86;$(LibraryPath)</LibraryPath>
    <ExcludePath>$(ProgramFiles)\Windows Kits.1\Include\um;$(ProgramFiles)\Windows Kits.1\Include\shared;$(ProgramFiles)\Windows Kits.1\Include\winrt;$(ExcludePath)</ExcludePath>
  </PropertyGroup>
<ItemDefinitionGroup />
</Project>

对于 x64 也类似:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ImportGroup Label="PropertySheets" />
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup>
    <ExecutablePath>$(ProgramFiles)\Windows Kits.1\bin\x64;$(ExecutablePath)</ExecutablePath>
    <IncludePath>$(ProgramFiles)\Windows Kits.1\Include\um;$(ProgramFiles)\Windows Kits.1\Include\shared;$(ProgramFiles)\Windows Kits.1\Include\winrt;$(IncludePath)</IncludePath>
    <LibraryPath>$(ProgramFiles)\Windows Kits.1\lib\winv6.3\um\x64;$(LibraryPath)</LibraryPath>
    <ExcludePath>$(ProgramFiles)\Windows Kits.1\Include\um;$(ProgramFiles)\Windows Kits.1\Include\shared;$(ProgramFiles)\Windows Kits.1\Include\winrt;$(ExcludePath)</ExcludePath>
  </PropertyGroup>
<ItemDefinitionGroup />
</Project>

但是请注意。虽然这将定义针对 Windows 8.1 SDK 构建所需的所有路径,但它不会更改 WindowSdkDir 和相关宏,它们仍然指向 Windows 8.0 SDK。如果您使用这些宏来定义项目属性,这可能会导致构建不一致。

最后,请注意 Visual Studio 2013 附带 Windows 8.1 SDK,相应地它是与默认 "Visual Studio 2013 (v120)" 平台工具集 属性 一起使用的 SDK。因此,如果升级到 VS2013 是一种选择,那可能会为您省去一些麻烦。