【问题标题】:Choosing from multiple DLL versions从多个 DLL 版本中进行选择
【发布时间】:2022-01-06 12:14:24
【问题描述】:

今天我构建了我的应用程序并使用 QtIF 打包了安装程序。它在我的电脑上运行良好,但抱怨在另一台电脑上缺少msvcp140_1.dll

然后我运行find . -iname "msvcp140_1.dll",在我的电脑上发现超过五个不同的,我检查了md5sum。

然后我花时间在另一台计算机上尝试所有这些,并且似乎一切正常。不再抱怨缺少 DLL。

我应该如何在 DLL 之间进行选择?随便挑一个似乎太容易了。

有没有办法检查 DLL 以检查版本?

我相信 DLL 是我的应用程序中包含的另一个二进制文件的依赖项,而不是 QtIF 未能包含它。

【问题讨论】:

  • 通常以d 结尾的Microsoft DLL 是调试DLL,不能分发。您应该构建一个发布版本,并在必要时在您的安装程序中包含 MS 可再发行包。
  • 这是在发布模式下完成的。好吧,至少我的构建,也许依赖于msvcp140_1.dll 的二进制文件不是。而且“在您的安装程序中包含 MS 可再发行包”听起来很奇怪,在这种情况下,我必须要求用户安装一个额外的东西,并且我正在使用 QtIF 打包安装程序以简化最终用户的生活。我的计划是添加缺少的 DLL。
  • redist 包是正确的做法。 MS 将其作为开发 SDK 的一部分包含在内是有原因的。您的安装程序应该在安装之前运行 redist 作为其安装的一部分,并且大多数安装程序框架已经具有执行此操作的配置选项(安装作为清单的一部分指定的 redist 框架)。

标签: c++ windows qt dll dllimport


【解决方案1】:

从您的安装程序调用 MS Redist 安装程序。这可以安静地完成,让最终用户不会注意到它。

  • 找到 vcredist_x64.exe 文件(或 vcredist_x32 用于 32 位应用程序),将其添加到您的安装程序中,
  • 让它解压到“TEMP”文件夹中
  • 然后在安装结束时调用vcredist_x64.exe /quiet

这有几个优点:

  • 您一定会将所有需要的文件复制到用户计算机上。
  • 如果新版本的运行时库由 Microsoft 发布并且它们已经在您的用户计算机上,您的代码将使用更新的版本,其中可能包含错误修复。
  • Windows 更新也可能会更新库。

也就是说,可以复制 DLL 本身,但您应该确保 a) 你选择了正确的 b)它们来自一个值得信赖的地方,即您的 VS 安装文件夹 c) 与可执行文件位于同一目录中 - 否则您将遇到清单问题。

您可能想要直接包含 DLL 的原因是您想要减小安装程序的整体大小。

我们用我们的产品做了几年,但最终放弃并简单地使用了vcredist_x64.exe,即使这将安装程序二进制文件的大小再增加了几 MB。但从长远来看,这是最简单的方法。

我认为(不确定),msvcp140_1.dll 是 VS 2019 运行时的附加 DLL。 VS 2017 运行时不需要这个,但新的需要。

【讨论】:

  • 你说服了我。你能告诉我更多关于我可能遇到的“清单问题”吗?
  • 呃,清单。那是很久以前的事。我认为您还必须复制清单文件,并且 DLL 和清单文件必须与您的二进制文件位于同一位置。如果您将二进制文件分发到子文件夹中,这会变得很复杂。
  • 我不确定您现在是否必须复制清单,或者它们现在是否位于运行时 DLL 中。如果必须,您还必须确保 DLL 版本、清单版本匹配。并且不要尝试混合和匹配不同的版本。行不通。
【解决方案2】:

不可再分发的方法是发送 your 编译器附带的 DLL,即构建可执行文件的编译器。毕竟,DLL 将被加载到与您的 EXE 相同的进程中。这些应该匹配是合乎逻辑的。

您会在 \Program Files*\Microsoft Visual Studio *\VC\Redist 中找到这些 DLL

【讨论】:

    猜你喜欢
    • 2016-11-12
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多