消除对Windows SDK版本的依赖

时间:2019-04-23 06:33:35

标签: c++ windows visual-studio mpir

我正在尝试编译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的文件中,并使用命令行编译器cl foo.cpp进行编译,它将自动编译并与任何版本的SDK链接当前的Visual Studio安装使用此工具生成foo.exe,除非您至少使用Vista,否则将cl.exe可以在任何Windows上运行(除非您使用了仅在更高Windows版本中可用的非常特殊的API)。

这与msbuild调用的docker stop $(docker ps -a -q)完全相同。因此,我并不需要新功能。相反,生成上述错误消息是因为超出了正常范围破坏了默认的“仅能正常工作”方案,并将锁添加到了特定的SDK版本。我在问如何删除锁,并返回到默认情况,该情况只适用于Visual Studio附带的任何SDK版本。

2 个答案:

答案 0 :(得分:3)

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

如果使用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链接。相反,它们依赖于Microsoft对C ++标准库(又名MSVCRT)的实现

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

答案 1 :(得分:1)

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

enter image description here