为啥我的 QT 应用程序不起作用?

Posted

技术标签:

【中文标题】为啥我的 QT 应用程序不起作用?【英文标题】:Why is my QT application not working?为什么我的 QT 应用程序不起作用? 【发布时间】:2013-01-17 00:02:36 【问题描述】:

我在 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 有什么问题...

【问题讨论】:

尝试从命令提示符运行可执行文件,以便您可以阅读错误消息并将其添加到您的问题中。 This may help @AntiEarth 给我空白行。没有错误信息... 如果您的应用程序处于调试模式,那么它不应该在其他计算机上运行。即使有需要的dll。如果是这样 - 制作发布变体 @borisbn 我的应用程序处于发布模式......什么都没有...... 确保你也复制必要的插件,也许你有这个问题:***.com/questions/14291078/… 【参考方案1】:

我遇到了同样的问题。

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

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

【讨论】:

【参考方案2】:

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

我在程序目录中添加了libEGL.dll,现在可以正常运行了。

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

【讨论】:

为我工作!非常感谢!!!我有同样的问题。对我来说,不需要包含“平台”文件夹并添加 mingwm10.dll。我刚刚添加了所有的DLL文件,当我点击我的.exe文件时,错误消息一直给我,然后最后一步是添加libEGL.dll,然后它就可以工作了!【参考方案3】:

我也遇到了同样的问题,并从this post 了解到 MinGW GCC 4.7 与 Qt 5.0 及更高版本不兼容。我采用了与您相同的方法,并切换到了 Qt Creator 4.8,它确实有效。

【讨论】:

【参考方案4】:

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

场景

    QT Creator 3.3.2 QT 5.4.1(MSVC 2010,32 位),Windows 8.1 操作系统 未使用动态加载的 dll 未使用第三方 dll 这是一个 QTWidget 应用程序。

方法(对 Kit MinGW 32 位和 MSVC2012 OpenGL 32 位都试过)

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

    在运行应用程序时,删除所有复制的 DLL 文件。

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

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

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

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

注意

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

【讨论】:

【参考方案5】:

我认为它必须是一些 DLL,您需要将其放在与可执行文件相同的目录中,或者甚至可能放在 PATH 中的目录中。不管怎样,我也在使用 Qt5,我遇到了和你一样的问题 if 我没有把这些和我的 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,但对于发布版本,它们没有。该部分在您的机器上可能相同也可能不同。我相信这是一个设置或一组。

【讨论】:

以上是关于为啥我的 QT 应用程序不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 QMenu:hover 在 Qt Designer 中不起作用

为啥“光标下的跟随符号”在 Mac OS X 的 Qt Creator 中不起作用?

为啥我的 commandListener 不起作用?

为啥我的南迁不起作用?

为啥我的函数在调用时不起作用? [关闭]

为啥我的 POST 请求仅对我的 API 不起作用?