7

我在 Windows 7 64 位(使用 msvc 2010)上使用 Qt Creator 构建了一个 Qt 5 应用程序。该应用程序可以在我的计算机上完美运行,但无法在其他计算机上运行。

我将Dependency Walker中显示为缺失的所有 .dll 复制到程序文件夹中,没有错误,但应用程序无法运行。

我已经在 Windows XP 和 Windows 7 64 和 32 位上对其进行了测试。
我该怎么做才能找出问题所在?

更新:我安装了 Qt 4.8.4 (vs 2008) 和 msvc 2008 express,我编译了它,它在其他计算机上运行,​​带有 Qt4 的 .dll。也许有人知道Qt5有什么问题......

4

5 回答 5

6

我有同样的问题。

您需要在可执行目录中包含包含 qwindows.dll 和 qminimal.dll 的“平台”目录。您可以在“插件”文件夹下找到该目录。

如果您不添加它,您的应用程序将显示为加载然后退出并返回代码 0。依赖项步行器无法帮助您,因为 DLL 是延迟加载的。

于 2013-06-17T21:16:55.770 回答
3

我遇到了同样的问题 - 我添加了 Dependency Walker 报告的所有 DLL,但我的程序在运行时立即退出,没有错误消息。

我添加libEGL.dll到程序目录,它现在运行正常。

我猜它libEGL.dll是由其他 DLL 之一动态加载的——可能libGLESv2.dll是基于它具有最相似名称的所有已知依赖项(!)——并且动态加载不是 Dependency Walker 可以检测到的。

于 2013-04-20T19:51:07.393 回答
1

我也遇到了同样的问题,并从这篇文章中了解到 MinGW GCC 4.7 与 Qt 5.0 及更高版本不兼容。我采取了与您相同的方法并切换到有效的 Qt Creator 4.8。

于 2013-03-03T19:43:02.597 回答
0

我也遇到了同样的问题,并尝试了 DLL 丢失消息和 Dependency Walker,但它没有帮助我,或者我不知道我是否正确使用它。下面的方法帮助我解决了(对于给定的场景)它。这种方法适用于一些最低限度的情况。

设想

  1. QT 创作者 3.3.2
  2. QT 5.4.1(MSVC 2010,32 位),Windows 8.1 操作系统
  3. 未使用动态加载 dll
  4. 未使用第三方 dll
  5. 这是一个 QTWidget 应用程序。

方法(尝试了套件 MinGW 32 位和 MSVC2012 OpenGL 32 位)

  1. 构建应用程序后获取发布 exe。复制并粘贴到我们想要的另一个文件夹(假设为 Z:\abc)
  2. 转到 Qt 套件(MinGW 或 MSVC)安装文件夹(在我的情况下:Z:\Qt\5.4\mingw491_32(或)Z:\Qt\5.4\msvc2012_opengl)
  3. 搜索 *.dll
  4. 复制所有 DLL 并将其粘贴到 exe 放置的文件夹中。即 (z:\abc)
  5. 运行应用程序(在我的情况下它正常启动)。
  6. 在运行应用程序时,删除所有复制的 DLL 文件。

    6.1) 删除时,Windows 将提示应用程序正在使用的 DLL 文件(使用中的文件),因为这些 DLL 最初是加载的。保持这些文件不变。

    6.2) 其他 DLL 文件将按照我们的要求被删除。

  7. 关闭应用程序并重新打开它(在我的情况下它正常启动)。
  8. 所以在这里我们得到了所需的DLL

这不是正确的方法,但在某些情况下可能会有所帮助。

笔记

在复制所有 DLL 时,当获取文件已存在消息时,根据系统决定将两个文件保持在不同的名称中。如果应用程序无法运行,那么我们可以尝试使用这些重命名的文件。

于 2015-07-16T07:19:48.627 回答
0

我认为它必须是一些 DLL,您需要将其放在与可执行文件相同的目录中,或者甚至可能放在 PATH 中的目录中。无论哪种方式,我也在使用 Qt5,如果我不将它们放在与我的 exe 文件相同的目录中,我会遇到与您相同的问题:

  • vcruntime140[d].dll(一个 MSVC 库)
  • ucrtbase[d].dll(另一个 MSVC 库——我正在使用 MSVC/Visual C++)
  • Qt5Widgets[d].dll(Qt 5 库)
  • Qt5Svg[d].dll(另一个 Qt 5 库)
  • Qt5PrintSupport[d].dll(另一个 Qt 5 库)
  • Qt5Gui[d].dll(你猜对了)
  • Qt5Core[d].dll(是的)
  • msvcp150[d].dll(我相信另一个 Microsoft 可再发行组件)

当然,您可能没有使用我正在使用的任何 Qt 库,在这种情况下您将不需要它们。此外,您可能有一个不同的工具链来调用不同的 DLL,但我认为这个想法是相同的,而且您的设置可能与我的相同。

我在每个库的末尾附加了一个[d],因为对于调试版本,它们最后有一个d,但对于发布版本,它们没有。该部分在您的机器上可能相同也可能不同。我相信这是一个设置或一组。

于 2020-08-12T01:11:55.083 回答