4

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

C:\Program Files (x86)\Microsoft Visual Studio\2017\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.您使用了一些仅在更高版本的 Windows 中可用的非常专业的 API)在至少从 Vista 开始的任何 Windows 上运行。cl foo.cppfoo.exe

cl.exe这与msbuild 调用的完全相同。所以我不是要求新功能。相反,之所以会生成上述错误消息,是因为某些东西不合时宜地破坏了默认的“它只是工作”场景并将锁定添加到特定的 SDK 版本。我在问如何移除锁并返回到默认场景,它只适用于 Visual Studio 附带的任何 SDK 版本。

4

2 回答 2

6

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

如果您使用 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>,并且它们不直接链接到 Windows API。相反,这些依赖于微软的 C++ 标准库(又名 MSVCRT)的实现

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

于 2019-04-23T08:34:22.177 回答
3

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

在此处输入图像描述

于 2019-04-23T09:22:33.547 回答