【发布时间】:2018-01-26 11:20:21
【问题描述】:
在将我的一些程序从 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(可在 Windows 10 SDK 中的Redist\ucrt\DLLs 找到目录)以及我的应用程序 - 仅重新分发 vcruntime140.dll 和 msvcp140.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 在 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。应用仍然无法启动。
[编辑]
这当然只适用于我链接到 DLL 运行时 (/MD)。如果我链接到“静态”运行时 (/MT),我会得到一个二进制文件,它在 UCRT 上 没有 DLL 依赖项,并且在 Windows 7 和 XP 上运行良好。
[编辑#2]
混乱的解决方法请参考我的另一篇帖子(包括编辑):
https://stackoverflow.com/a/45773325/1766377
【问题讨论】:
-
最好是为XP创建额外的项目配置,在VM中安装旧版本的VS并通过旧版本的VS编译xp项目文件。
-
我已经在我的项目配置中选择了
v141_xp工具集 - 它专门针对 Windows XP。在 VS2015 中,使用v140_xp工具集非常适合为 Windows XP 创建二进制文件 - 只要我重新分发 Windows 10 SDK 中的vcruntime140.dll和msvcp140.dll以及api-ms-win-*UCRT DLL。但似乎 VS2017 现在正在链接到较新的 UCRT 版本,所需的可再发行组件(尚未)可用 - 无论是在 Windows 10 SDK 中还是通过 VS2017 可再发行安装程序 - 这对我来说似乎是一个错误...... -
我了解您的问题。这就是为什么使用旧版本的 VS 编译 XP exe 的原因
-
我可以在较旧的 VS 版本(例如 VS2015)上使用它来生成可在 Windows 7 或 Windows XP 上运行的二进制文件,这不是的重点。关键是 - 据我所知 - VS2017 应该 生成适用于 Windows 7 的二进制文件(以及在选择
v141'_xp工具集时也适用于 Windows XP),但显然无法做到所以!或者,更具体地说,M$ 似乎没有在其当前的 Windows SDK 中为这些平台提供正确的可再发行 DLL。
标签: c++ visual-studio windows-7 visual-studio-2017 windows-xp