VS2017 并在 Win7/XP 上缺少 "api-ms-win-core-rtlsupport-l1-2-0.dll"
VS2017 and missing "api-ms-win-core-rtlsupport-l1-2-0.dll" on Win7/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(可在Windows 10 SDK 目录中的 Redist\ucrt\DLLs
)以及我的应用程序 - 仅重新分发 vcruntime140.dll
和 msvcp140.dll
不够 。但是我的WindowsSDK目录下只有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
在 Windows 7(或 XP)机器上安装 VS2017 Redistributable 软件包 - 从 Visual Studio 网站下载的最新版本 (14.11.25325) .显然,这会将 api-ms-win-*
DLL 复制到“System32”目录中。但是,同样,只有 api-ms-win-core-rtlsupport-l1-1-0.dll
,但 而不是 api-ms-win-core-rtlsupport-l1-2-0.dll
。应用程序仍然无法启动。
[编辑]
这当然只适用于我 link 针对 DLL 运行time (/MD
) 的情况。如果我 link 反对“静态” 运行time (/MT
) 我得到一个二进制文件 no DLL 依赖于 UCRT 和 运行在 Windows 7 和 XP 上没问题。
[编辑#2]
乱七八糟的解决方法请参考我的另一篇post(含EDIT):
在项目的 属性 页面中,尝试将 Windows SDK 版本从 10.0.15063.0 更改为 10.0.10240.0。我认为这会解决它,前提是您的构建机器上安装了旧的 SDK。还可以尝试将平台工具集更改为 v140_xp。 VS 2017 然后使用 VS 2015 工具链构建,前提是安装了 VS 2015。
我个人的偏好是通过与静态运行时链接来避免任何 'DLL hell',尽管如果 exe 和 dll 需要共享堆并招致一些 space 惩罚,这将不起作用如果您正在构建多个二进制文件(我只有两个)。
好的,这很有趣:刚刚我的 VS2017 发现了一个新的更新。显然,将我的 VS2017 从 v15.2 更新为 v15.3.1。运行时库似乎也已更新!
现在有两个目录,VC\Redist\MSVC.11.25325
和VC\Redist\MSVC.11.25415
,在我的 VS2017 安装目录中。 vcruntime140.dll
存在于两个目录中。但是 较新的 版本(25415,右)与旧版本(25325,左)相比具有完全不同的依赖关系:
只有“新”版本在 Windows 7 上缺少依赖项。所以,我应该可以使用“旧”版本。但这意味着我被锁定到“旧”版本。这是正常的/有意的吗???
(顺便说一句:VS2017 v15.3.1 的两个 DLL 版本都比我最初从 获取的版本更新 v15.2)
[编辑]
所以,刚刚引起我注意的是 微妙 VC\Redist\MSVC.11.25325
[=39] 之间的区别=]和 VC\Redist\MSVC.11.25415
目录:25415目录的所有DLL文件都在另一个名为onecore
的子文件夹中,另一个没有。显然,这意味着“较新”的 DLL 版本(带有 onecore
子文件夹的版本)是 而不是 应该重新分发使用普通的桌面应用程序;它们仅适用于“OneCore”Mobile/IoT 平台。
结论:
M$ 在设计 Redist 目录结构方面做得很好 尽可能混乱。将“普通”和“onecore”可再发行组件的版本号放在目录层次结构的同一级别(而不是在 [=50= 上有单独的 onecore
和 desktop
目录]that level) 表示这些目录代表同一事物的不同版本 - 根本不是这种情况:-/
不要*不要*使用普通桌面应用程序重新分发任何 */onecore/*
DLL!
将我的一些程序从 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(可在Windows 10 SDK 目录中的 Redist\ucrt\DLLs
)以及我的应用程序 - 仅重新分发 vcruntime140.dll
和 msvcp140.dll
不够 。但是我的WindowsSDK目录下只有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
在 Windows 7(或 XP)机器上安装 VS2017 Redistributable 软件包 - 从 Visual Studio 网站下载的最新版本 (14.11.25325) .显然,这会将 api-ms-win-*
DLL 复制到“System32”目录中。但是,同样,只有 api-ms-win-core-rtlsupport-l1-1-0.dll
,但 而不是 api-ms-win-core-rtlsupport-l1-2-0.dll
。应用程序仍然无法启动。
[编辑]
这当然只适用于我 link 针对 DLL 运行time (/MD
) 的情况。如果我 link 反对“静态” 运行time (/MT
) 我得到一个二进制文件 no DLL 依赖于 UCRT 和 运行在 Windows 7 和 XP 上没问题。
[编辑#2]
乱七八糟的解决方法请参考我的另一篇post(含EDIT):
在项目的 属性 页面中,尝试将 Windows SDK 版本从 10.0.15063.0 更改为 10.0.10240.0。我认为这会解决它,前提是您的构建机器上安装了旧的 SDK。还可以尝试将平台工具集更改为 v140_xp。 VS 2017 然后使用 VS 2015 工具链构建,前提是安装了 VS 2015。
我个人的偏好是通过与静态运行时链接来避免任何 'DLL hell',尽管如果 exe 和 dll 需要共享堆并招致一些 space 惩罚,这将不起作用如果您正在构建多个二进制文件(我只有两个)。
好的,这很有趣:刚刚我的 VS2017 发现了一个新的更新。显然,将我的 VS2017 从 v15.2 更新为 v15.3.1。运行时库似乎也已更新!
现在有两个目录,VC\Redist\MSVC.11.25325
和VC\Redist\MSVC.11.25415
,在我的 VS2017 安装目录中。 vcruntime140.dll
存在于两个目录中。但是 较新的 版本(25415,右)与旧版本(25325,左)相比具有完全不同的依赖关系:
只有“新”版本在 Windows 7 上缺少依赖项。所以,我应该可以使用“旧”版本。但这意味着我被锁定到“旧”版本。这是正常的/有意的吗???
(顺便说一句:VS2017 v15.3.1 的两个 DLL 版本都比我最初从 获取的版本更新 v15.2)
[编辑]
所以,刚刚引起我注意的是 微妙 VC\Redist\MSVC.11.25325
[=39] 之间的区别=]和 VC\Redist\MSVC.11.25415
目录:25415目录的所有DLL文件都在另一个名为onecore
的子文件夹中,另一个没有。显然,这意味着“较新”的 DLL 版本(带有 onecore
子文件夹的版本)是 而不是 应该重新分发使用普通的桌面应用程序;它们仅适用于“OneCore”Mobile/IoT 平台。
结论:
M$ 在设计 Redist 目录结构方面做得很好 尽可能混乱。将“普通”和“onecore”可再发行组件的版本号放在目录层次结构的同一级别(而不是在 [=50= 上有单独的 onecore
和 desktop
目录]that level) 表示这些目录代表同一事物的不同版本 - 根本不是这种情况:-/