VS2017并在Win7 / XP上缺少“api-ms-win-core-rtlsupport-l1-2-0.dll”

时间:2017-08-17 21:40:12

标签: c++ visual-studio windows-7 visual-studio-2017 windows-xp

将我的一些程序从VS2015移植到VS2017后注意到二进制文件不再在Windows 7或Windows XP上运行 - 即使它们已经使用v141_xp工具集编译了。该程序无法以缺少的DLL api-ms-win-core-rtlsupport-l1-2-0.dll开始(请注意 2 )。

我很清楚那些api-ms-win-* DLL属于UCRT,从VS2015开始,我必须从Windows 10 SDK重新分发UCRT DLL(可在Redist\ucrt\DLLs找到Windows 10 SDK目录)以及我的应用程序 - 只需重新分发vcruntime140.dllmsvcp140.dll 就足够了。但是我的Windows SDK目录中只有api-ms-win-core-rtlsupport-l1-1-0.dll,但不是 api-ms-win-core-rtlsupport-l1-2-0.dll。我刚刚下载并重新安装了最新的Windows SDK(10.0.15063)。仍然没有相关的DLL!

我还尝试通过VC_redist.x86.exe - 从Visual Studio网站(14.11.25325)下载的最新版本在Windows 7(或XP)计算机上安装VS2017 Redistributable软件包。显然,将api-ms-win-* DLL复制到“System32”目录中。但是,同样,只有api-ms-win-core-rtlsupport-l1-1-0.dll,但不是 api-ms-win-core-rtlsupport-l1-2-0.dll。应用仍然无法启动: - /

有什么想法吗?

谢谢和最诚挚的问候,
MULDER

enter image description here

enter image description here

[编辑]

这当然只适用于我链接DLL运行时(/MD)。如果我链接到“静态”运行时(/MT),我会得到一个在UCRT上具有 no DLL依赖关系的二进制文件,并且在Windows 7和XP上运行良好。

[编辑#2]

请参阅我的其他帖子(包括编辑)以解决混乱问题:
https://stackoverflow.com/a/45773325/1766377

2 个答案:

答案 0 :(得分:5)

好的,这很有意思:刚刚我的VS2017发现了一个新的更新。显然,我的VS2017从 v15.2 更新为 v15.3.1 。运行时库也已更新,似乎!

我的VS2017安装目录中现在有 两个 目录VC\Redist\MSVC\14.11.25325 VC\Redist\MSVC\14.11.25415。两个目录中都存在 vcruntime140.dll 。但是较新的版本(25415,右)与旧版本(25325,左)相比具有完全不同的依赖关系:

enter image description here
只有“新”版本具有Windows 7中缺少的依赖项。因此,我应该使用“旧”版本。但这意味着我已经锁定了“旧”版本。这是正常的吗?

(顺便说一下:VS2017的两个DLL版本 v15.3.1 更新比我最初从 v15.2 获取的)

的问候,
MULDER

<强> [编辑]

因此,我只注意到VC\Redist\MSVC\14.11.25325 {{1}之间存在 微妙的 差异目录:25415目录将所有DLL文件放在另一个名为VC\Redist\MSVC\14.11.25415的子文件夹中,另一个则没有。显然,这意味着“较新的”DLL版本(具有onecore子文件夹的版本) 应该与普通桌面应用程序一起重新分发;它们严格用于“OneCore”移动/物联网平台。

结论:
M $做得很好,设计Redist目录结构 尽可能让人感到困惑 。将“normal”和“onecore”可再发行组件的版本号放在目录层次结构的同一级别上(而不是在 上具有单独的onecoreonecore目录 级别)表示这些目录代表同一事物的不同版本 - 根本不是这样: - /

不要*用正常的桌面应用程序重新分发任何desktop DLL!

答案 1 :(得分:0)

在项目的属性页中,尝试将Windows SDK版本从10.0.15063.0更改为10.0.10240.0。我认为这将解决它,前提是您的构建计算机上安装了较旧的SDK。要尝试的其他事情是将平台工具集更改为v140_xp。如果安装了VS 2015,VS 2017将随VS 2015工具链一起构建。

我个人的偏好是避免任何DLL地狱&#39;通过与静态运行时链接,虽然如果你正在构建多个二进制文件(我只有两个),如果一个exe和一个dll需要共享一个堆并且会产生一些空间损失,这将无法工作。