我正在尝试编译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版本。
答案 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)