【发布时间】:2019-04-23 06:33:35
【问题描述】:
我正在尝试编译 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,它将(除非您使用某些仅在更高版本的 Windows 中可用的非常专业的 API)在至少从 Vista 开始的任何 Windows 上运行。
这与 msbuild 调用的 cl.exe 完全相同。所以我不是要求新功能。相反,之所以会生成上述错误消息,是因为 出了问题 打破了默认的“它只是工作”场景并将锁定添加到特定的 SDK 版本。我在问如何解除锁定并返回到默认情况下,它只适用于 Visual Studio 附带的任何 SDK 版本。
【问题讨论】:
-
那么您基本上是在问如何消除平台定位,这是 VS 项目的重要组成部分。
-
@VTT 消除,是的。必要的,这没有任何意义。不同的 SDK 版本相互兼容。一个编写良好的 C++ 程序,除非它正在做一些极其专业的事情,需要仅在最新版本的 Windows 中提供的功能,否则应该能够使用过去十年左右发布的任何 SDK 进行构建。
-
不幸的是,事情并非如此。例如,为了使用自 Windows Vista 以来一直存在的
GetFileVersionInfoSizeExW函数,需要链接到 version.dll 或 api-ms-win-core-version-l1-1-0.dll 或 api-ms -win-core-version-l1-1-1.dll,取决于目标 SDK。很多东西被转移或重新设计(DirectX SDK 是最臭名昭著的例子)。 -
嗯,这是一个不同的问题。通常,人们只针对与受支持的最旧系统相对应的 Windows 版本。如果他们需要在新系统上使用一些新功能而不破坏与旧系统的兼容性,则需要拆分项目,或者需要通过手动加载适当的 dll 来调用新的东西(当它是基于 COM 的东西时,这不是一个大问题) .
-
@rwallace:针对 Windows 7 或 8 SDK。 Windows 10 向后兼容。它仍然有来自 Vista 的
version.dll。 Windows 知道使用旧 DLL 的程序是使用旧 SDK 构建的。
标签: c++ windows visual-studio mpir