无法在发布模式下编译的 ide 之外运行 qt-creator 可执行文件

Posted

技术标签:

【中文标题】无法在发布模式下编译的 ide 之外运行 qt-creator 可执行文件【英文标题】:Unable to run qt-creator executable outside ide compiled in release mode 【发布时间】:2020-03-29 12:36:15 【问题描述】:

切换到发布模式以构建我拥有的一个小项目后,当我尝试从 qt-creator ide 内部运行它时,一切正常。但是当我转到文件夹build-<project_name>-Desktop_Qt_5_14_1_MinGW_64_bit- Release 并尝试运行在该目录中生成的可执行文件时,我得到了这个错误:

有人知道这里有什么问题吗?如果它是一些丢失的 dll,我想它会指定丢失的 dll,对吧?还是我弄错了?

更新

运行windeployqt后,此命令找到了我的应用程序的依赖项,创建了一些文件夹,但现在尝试运行时出现错误:

更新 2

运行实用程序dependency walker 后,我得到了这个错误:

我正在使用这个构建工具包在 qt-creator 中构建项目:

【问题讨论】:

您可能在 PATH 中有一些可用的 dll,这就是它不会抱怨缺少 dll 的原因。要部署您的应用程序,请查看 windeployqt unitlity,它与 Qt 捆绑在一起 使用 windeployqt.exe 工具将必要的 dll 添加到运行发布可执行文件的文件夹中。另见wiki.qt.io/Deploy_an_Application_on_Windows 在哪里可以找到这个 windeployqt 实用程序?我在 Qt 安装目录中找不到它(对我来说,D:\Qt\Qt5.14.1\Tools\QtCreator\bin 找到windeployqt,运行它,但是当我尝试运行我的应用程序时仍然出现错误(使用新错误更新问题)。 @KleberMota 看起来问题与编译器库有关。阅读这个答案***.com/a/52127944/4149835 【参考方案1】:

这是我对 Windows 上 Qt 部署和问题的所有了解。

    检查项目的发布配置是否不包含任何调试版本库的链接。 在发布模式下构建您的应用程序。如有疑问,请使用重建查看 IDE 中的编译输出窗口,了解它实际使用的路径。 使用 windeployqt 工具自动将所有必要的 Qt dll 复制到可执行文件的文件夹中。确保您使用的是正确文件夹中的 windeployqt.exe。例如,目前我有一个版本的 Qt 框架,但有两个版本的 windeployqt:用于 x86x64 编译器。如果您安装了多个版本的 Qt,您可能有多个版本的工具。

 C:\Qt\Qt5.14.1\5.14.1\msvc2017\bin\windeployqt.exe
 C:\Qt\Qt5.14.1\5.14.1\msvc2017_64\bin\windeployqt.exe

    将编译器库复制到发布文件夹。确保您从用于构建的确切编译器复制库。

    复制所有必要的附加 3 方动态库。确保它不是调试版本。

    如果问题仍然存在,请在错误消息处于活动状态时按 Ctrl+C。它将复制消息框中的所有文本。将邮件的主要部分粘贴到 Google。

    如果问题仍然存在,请在某些 dll 依赖项查看器中打开您的 .exe 文件。这是我在Lister 中看到的方法。请注意,这样的工具不仅会显示丢失的 dll,还会显示可执行文件实际使用的每个 dll 的完整路径。更强大的工具是 Dependency Walker。

    确保您的应用程序在没有相应权限的情况下不会尝试向系统受保护的文件夹(例如 c:\Program Files\)写入内容。

    如果问题仍然存在,尽可能简化您的项目。为空项目运行 Release。比逐步添加模块、功能和库。

    如果一切正常,请在完全干净的虚拟机上测试应用程序。


编辑。我用谷歌搜索你的错误文本和我发现的内容:https://android.developreference.com/article/11361766/Qt5+deployment+%E2%80%9Cprocedure+entry+point+could+not+be+located%E2%80%9D

问题是windeployqt 无法找到某些gcc 原因。我使用 SET 从 cmd 将它添加到我的路径中 PATH=%PATH%;C:\Qt\Tools\mingw530_32\bin。在我运行windeployqt之后 同样,我不必复制 libgcc_s_dw2-1.dll 和 libwinpthread-1.dll 手动完成,它使用了正确的 Qt5Core.dll, 因为应用程序现在工作正常。

Edit2.多余的项目已删除。

【讨论】:

好的,我使用实用程序dependency walker,并在问题中的更新 2 中附加了错误。不知何故,实用程序说,除其他外,我正在使用具有不同 cpu 的模块,但我正在使用 mingw 64 位和 Qt 的 64 位版本构建项目。不知道这个其他 cpu 的模块是从哪里来的。 @KleberMota 如果您确定已检查所有编译器路径,请尝试运行 Qt 内置示例,然后简化您的项目(或者如果您使用版本控制,则回滚到某些旧提交) @KleberMota 我用谷歌搜索你的错误文本和我发现的内容:android.developreference.com/article/11361766/… 我终于解决了这个问题,但不知道为什么要解决。我做了什么:我尝试了一个不同的windeployqt实用程序,使用D:\Qt\Qt5.14.1\5.14.1\msvc2017_64\bin\windeployqt.exe而不是D:\Qt\Qt5.14.1\5.14.1\mingw73_64\bin\windeployqt.exe(不复制libgcc、libstdc++和libwinpthread,手动复制)。为什么这适用于 msvc2017 版本的 windeployqt?我正在使用安装了 Qt-Creator 的 MinGW-64bits 套件进行构建。 @KleberMota 您是否检查了 Qt Creator 中的编译输出文本?它实际上打印了什么?

以上是关于无法在发布模式下编译的 ide 之外运行 qt-creator 可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

请教:qt下如何调用linux下编译的驱动程序

Cygwin下编译的程序不使用Cygwin.dll即可运行的命令 及常用命令简介

我的朋友无法在他的 linux 发行版上运行我的 openGL 程序

如何在不安装 IDE 的情况下编译和运行此 Delphi 代码?

如何在Windows下面运行hadoop的MapReduce程序

Qt编译生成的exe无法执行