Qt 应用程序在发布时挂起,vcruntime140.dll 未在调试中找到,但我的项目使用的是 VS2017

Qt app hangs in release, vcruntime140.dll not found in debug, but my project is using VS2017

我制作的应用程序有问题,它在大多数计算机上运行完美,但有几台计算机。

我尝试制作最简单的 Qt 项目(只是一个 window)并使用 windeployqt.exe 部署它以确保我没有遗漏任何东西,等等,同样的问题在同一台计算机上,它在以发布模式加载时永远挂起。之后我试图给他发送一个 Debug 版本,它触发了 vcruntime140.dll not found.

棘手的是我正在使用 Qt Desktop 5.14.2 MSVC2017 64 位所以我无法想象为什么它要求 vcruntime140 (vs2015) 还尝试手动安装 vs2015 redist windows 自更新版本以来失败已经存在。

谢谢你的任何提示,这让我抓狂!

我不能告诉你为什么用 MSVC2017 构建需要 vc运行time140 到 运行,但我建议你通过 MSI 安装程序分发你的应用程序。您可以使用 WiX 工具集 (link) 创建一个。开始使用它可能有点困难,但您可以在 Internet 上找到很多关于 WiX 的教程和信息。

因此,如果您要构建安装程序,则可以将稍后需要的外部资源(合并模块 [link])附加到 运行 您的应用程序。它可能是 Microsoft Redistributable 软件包。 WiX 正在使用基于 xml 结构的 .wxs 文件,因此例如在我的一个安装程序中,我将 VC120 和 VC140 资源添加到我的安装程序的描述符中,如下所示:

<DirectoryRef Id="TARGETDIR">
    <Merge Id="VC120Redist" SourceFile="Microsoft_VC120_CRT_x86.msm" DiskId="1" Language="0"/>
    <Merge Id="VC140Redist" SourceFile="Microsoft_VC140_CRT_x86.msm" DiskId="1" Language="0"/>
</DirectoryRef>
<Feature Id="VC120Redist" Title="Visual C++ 13 Runtime" AllowAdvertise="no" Display="hidden" Level="1">
    <MergeRef Id="VC120Redist"/>
</Feature>
<Feature Id="VC140Redist" Title="Visual C++ 15 Runtime" AllowAdvertise="no" Display="hidden" Level="1">
    <MergeRef Id="VC140Redist"/>
</Feature>

使用这种方法,安装程序会处理 Microsoft 资源,您无需担心每台客户端电脑是否都安装了正确的程序包。

创建好的 .wxs 文件并不容易,但从长远来看,这是值得的。

今天 Qt 5.15 已经发布,将我的 Qt 依赖项从 5.14.2 升级到 5.15,修复了 Qt 版本中未标记为错误修复的问题,但我的问题已经消失。

windeployqt 在部署文件夹中包含 vc_redist.<arch> 可执行文件,当我将应用程序部署到其他 Windows PC 时,有时我会收到 vcruntime140.dll 和其他的错误声明MS Visual C++ 可再发行 DLL .. 我只是 运行 包含的可执行文件,例如 vc_redist.x64.exe 用于 64 位 OS .. 通常问题已解决;我理解目标 PC 可能已经有了更新版本的 redisreb .. 但我一直认为较新的版本通常是向后兼容的.. ,不过我认为 Qt 在编译时包含了应用程序所需的正确 redisreb。