将我的一些程序从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.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
- 从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
[编辑]
这当然只适用于我链接DLL运行时(/MD
)。如果我链接到“静态”运行时(/MT
),我会得到一个在UCRT上具有 no DLL依赖关系的二进制文件,并且在Windows 7和XP上运行良好。
[编辑#2]
请参阅我的其他帖子(包括编辑)以解决混乱问题:
https://stackoverflow.com/a/45773325/1766377
答案 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,左)相比具有完全不同的依赖关系:
只有“新”版本具有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”可再发行组件的版本号放在目录层次结构的同一级别上(而不是在 上具有单独的onecore
和onecore
目录 级别)表示这些目录代表同一事物的不同版本 - 根本不是这样: - /
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需要共享一个堆并且会产生一些空间损失,这将无法工作。