删除对 Windows SDK 版本的依赖

Removing dependency on Windows SDK version

我正在尝试编译 MPIR(Windows 友好版本的 GMP)。我安装了 Visual Studio 2017,所以它应该可以工作,但我收到此错误消息:

C:\Program Files (x86)\Microsoft Visual Studio17\Community\Common7\IDE\VC\VCTargets\Microsoft.Cpp.WindowsSDK.targets(46,5): error MSB8036: The Windows SDK version 8.1 was not found. Install the required version of Windows SDK or change the SDK version in the project property pages or by right-clicking the solution and selecting "Retarget solution". [C:\mpir\msvc\vs17\lib_mpir_gc\lib_mpir_gc.vcxproj]

我特别需要达到它可以在任何机器上编译的程度,而不仅仅是这台机器,所以在这台机器上安装确切的 SDK 版本不会解决问题。我需要更改一些内容才能使用 Visual Studio 2017 进行构建。

C:\mpir\msvc\vs17\lib_mpir_gc\lib_mpir_gc.vcxproj 中查找,我找到了行:

<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>

看起来很有希望,但是删除它没有任何效果;错误信息保持不变。

我可以更改什么来消除此错误?

总结一下我相信这应该是可能的原因:

如果你写一个 C++ 程序,比如说在最简单的情况下,在一个名为 foo.cpp 的文件中,然后用命令行编译器编译它 cl foo.cpp 它会自动编译并且 link 与当前 Visual Studio 安装使用的任何 SDK 版本一起生成 foo.exe 将(除非你使用一些非常专业的 API 仅在以后的 Windows 版本中可用)[=至少在 Vista 上的任何 Windows 上 50=]。

这与 msbuild 调用的 cl.exe 完全相同。所以我不是在要求新功能。相反,生成上述错误消息是因为某些东西 以其方式 破坏了默认的 'it just works' 场景并将锁定添加到特定的 SDK 版本。我问的是如何解除锁定并返回到默认情况,在默认情况下它只适用于 Visual Studio 随附的任何 SDK 版本。

如评论所述,这是不可避免的。

如果您使用 Windows 8.1 SDK 构建,您将获得 运行 在 Windows 8.1 或更高 上的版本。如果您使用 Windows 10 SDK 构建,您可以将其功能限制为 Windows 8,或者您可以选择 Windows 10 构建(例如 1607)。当然,如果您选择一个新的 SDK 来使用新的 Windows 10 功能,您不能 运行 在 Windows 8.1 上使用它,因为它缺少该功能。

但是,如果您选择Windows SDK,那么您会构建哪个Windows版本?您会使用哪个 <windows.h>

[编辑] 至于可移植的C++程序,它们显然不包含<windows.h>,它们也不link直接针对Windows API的。相反,它们依赖于 Microsoft 对 C++ 标准库(又名 MSVCRT)的实现

[edit2] 我刚刚数了一下,我的 Visual Studio 2017 安装 (15.7.5) 有 12 个不同的 SDK 选项。的确,有些是针对 ARM 的,但这只是基本前提的变体:您选择的 SDK 会影响您可以 运行 生成应用程序的机器。

VS2019 支持通过选择适当的项目将项目定位到最新安装的 Windows SDK 版本。这可能会或可能不会产生预期的结果,但肯定会消除手动项目重定向的需要。