【问题标题】:Cannot run Qt Creator GUI outside of Qt. "The application was unable to start correctly (0xc000007b)" error无法在 Qt 之外运行 Qt Creator GUI。 “应用程序无法正确启动 (0xc000007b)”错误
【发布时间】:2019-07-19 10:42:21
【问题描述】:

我从 GitHub 下载了 C++ 代码来标记图像,以使用机器学习训练对象检测器。

在基于 Qt 5.8.0 (MSVC 2015, 32bit) 的 Qt Creator 4.2.1 中,我能够编译和运行代码。不幸的是,我无法在 Qt Creator 之外运行 .exe。

最初,我收到一个错误

"The program can't start because libgcc_s_dw2-1.dll is missing". 

感谢 QT The program can't start because libgcc_s_dw2-1.dll is missing,通过添加

轻松修复
"QMAKE_LFLAGS += -static" 

到 .pro 文件。现在,当我运行它时,我得到了

"The application was unable to start correctly (0xc000007b). Click OK to close the application."  

我能够使用创建 Qt Widget 应用程序时出现的简单“Hello World”默认项目来重现该错误。这让我相信我的安装出了点问题。

根据这篇文章的建议:https://stackoverflow.com/questions/12099117/32-bit-qt-application-on-win-7-x64-wont-run-but-runs-fine-from-qt-creator,我使用 Dependency Walker 来确定可能的原因。我预计只会看到一些我可以跟进的项目。相反,我收到了将近 100 个丢失的 .dll 文件的列表。所有以

开头的文件
"API-MS-WIN ###.DLL" or "EXT-MS ###.DLL" 

其中### 表示一些额外的文本字符,例如;

"API-MS-WIN-SHCORE-STREAM-WINRT-L1-1-0.DLL" 

我正在附加一个示例输出。

另一个建议是复制过来

libwinpthread-1.dll, libstdc++-6.dll, libgcc_s_dw2-1.dll.   

那也没用。

我的下一步是简单地获取最新版本的 QT 并祝愿一切顺利。我安装了基于 At 5.12.0(MSVC 2015,32 位)的 Qt Creator 4.8.1。这一次,我什至无法让代码在 IDE 中运行。我收到了 1000 多条错误消息!

根据几页的建议,我添加了

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 

到 .pro 文件,它仍然无法编译。

另外,我验证了该应用程序正在构建为 32 位应用程序。我在 64 位 Windows 10 系统上运行。

如果有人想破解它,看看他们是否可以创建一个工作的 .exe,这里是链接:github.com/clavicule/BBTag

【问题讨论】:

    标签: c++ qt compiler-errors


    【解决方案1】:

    Qt 提供了一个工具,可以将必要的 dll 复制到可执行文件的文件夹中。

    这些工具名为 windeployqt.exe,随 Qt 安装一起提供。对我来说,它位于C:\Qt\5.9.1\msvc2015_64\bin\windeployqt.exe。您将不得不查看您的安装路径,可能还需要查看 msvc_32 文件夹才能找到它。

    然后你进入你的可执行文件所在的文件夹,打开命令提示符或powershell并执行path\to\windeployqt.exe yourProgram.exe,它会自动将必要的dll文件复制到这个文件夹中。之后,您可以毫无问题地运行您的程序。

    该工具的官方文档可以在here找到。

    备选方案 1:在开发过程中,您可以使用 QtCreator,它会在运行程序时自动添加 dll 的路径 - 如果您部署程序,请确保包含它们!

    备选方案 2:将必要 dll 的路径添加到 PATH 变量中。也不建议这样做,因为获得您的程序的每个人都必须这样做才能运行它。

    【讨论】:

    • 感谢您的建议。它将 23 个 DLL 复制到包括一些子文件夹的文件夹中,但不幸的是,我仍然遇到同样的错误。受够了,我卸载了两个版本的 Qt,并按照 Github 页面上的建议使用 Qt v5.5 从头开始​​。我仍然收到相同的错误消息。一年前我尝试过,遇到了同样的问题,然后放弃了。我现在正努力不放弃。 GitHub 页面也有一个二进制文件,但它也不会运行。如果有人想破解它,看看他们是否可以创建一个工作的 .exe,这里是链接:github.com/clavicule/BBTag
    • 有时 windeployqt 会遗漏一些事情。我发现在包含可执行文件的目录上运行它有时会拾取不会被拾取的东西。我还发现有时我需要指定要添加的特定模块(例如 --opengl --printsupport)。仔细查看它说缺少的 DLL 以确定要添加的内容。
    • @jwernerny 感谢您提供针对包含文件夹运行它的提示。当我回到我的机器时,我会尝试一下。我收到的错误消息不再提及任何 DLL,并且 Dependency Walker 识别出超过 100 个。这些是 Windows DLL,我无法想象我应该找到并传输这么多 DLL。 stackoverflow.com/questions/20045015/… 看起来有另一种方式来复制 dll。希望其中一种方法有效。谢谢大家。
    【解决方案2】:

    我想通了!我安装的 Anaconda(一种流行于数据科学和机器学习的 Python 发行版)是罪魁祸首。

    来自:@remy-lebeau

    The application was unable to start correctly (0xc000007b)

    错误:

    "The application was unable to start correctly (0xc000007b) ..." 
    

    很好地表明 32 位应用程序尝试加载 64 位 DLL。起初,这没有意义,因为我多次验证我使用的是 32 位版本的 Qt。

    事实证明,64 位版本的 Anaconda 的安装还包含许多用于 PyQt5 包的 Qt5 dll。由于此文件夹的路径位于我的 c:\Qt...\bin 文件夹的路径之前,因此它在构建中使用,而不是与 Qt 一起安装的实际 32 位版本。这并不明显,因为我不知道 PyQt5,所以我不知道它是随 Anaconda 一起提供的。使用系统环境变量界面对路径条目进行简单的重新排序并重新启动系统即可解决问题。

    一线希望:我现在了解 C++ 并使用 QT 和 PyQt5 设计 GUI

    感谢@albertmand 和@jwernerny

    【讨论】:

    • 很高兴您发现了这个晦涩难懂的问题!
    猜你喜欢
    • 2019-08-29
    • 2020-05-13
    • 2014-02-16
    • 2014-07-21
    • 1970-01-01
    相关资源
    最近更新 更多