无法在 Windows XP 中运行使用 QT5 和 VS2013 创建的应用程序

Posted

技术标签:

【中文标题】无法在 Windows XP 中运行使用 QT5 和 VS2013 创建的应用程序【英文标题】:Cant Run Application Created With QT5 And VS2013 In Windows XP 【发布时间】:2016-03-29 22:01:05 【问题描述】:

我使用QT5Visual Studio 2013 创建了应用程序。我还在我的应用程序中使用了QT WebEngine

我的应用程序在 Windows 7(32 位)中运行良好。出于某种原因,我需要在 windows xp sp3(32 位)中运行它。

当我运行它时,我收到以下错误:

The procedure entry point strnlen could not be located in the dynamic link library msvcrt.dll

我按OK 几次,它消失了,我的QMainWindow 会弹出,但它完全是黑色的,我在调试器中看到以下错误。

class QWindowsEGLStaticContext *__cdecl QWindowsEGLStaticContext::create(class QFlags<enum QWindowsOpenGLTester::Renderer>): Could not initialize EGL display: error 0x3001
class QWindowsEGLStaticContext *__cdecl QWindowsEGLStaticContext::create(class QFlags<enum QWindowsOpenGLTester::Renderer>): When using ANGLE, check if d3dcompiler_4x.dll is available

d3dcompiler_47.dll 也在应用程序目录中。

这里有什么问题吗?

更新 1

我将 3dcompiler_46.dll 放在可执行文件的目录中,结果就是这样。

我仍然收到The procedure entry point strnlen could not be located in the dynamic link library msvcrt.dll 错误,但在我按Ok 后,我也收到以下错误。

The procedure entry point _except_handler4_common could not be located in the dynamic link library msvcrt.dll

QMainWindow 仍然是BLACK,关于ANGLE 的错误是一样的。

更新 2

我使用以下配置为Windows XP 构建QT

configure -release -opensource -opengl desktop -target xp -platform win32-msvc2013 -angle -icu -nomake examples -prefix C:\QT-Compile

我替换了QT 依赖并运行了我的应用程序,我得到了以下错误:

The application has failed to start because icuin56.dll was not found
The application has failed to start because icuuc56.dll was not found

我试图在 QT 目录 (C:\QT-Compile) 中找到它们,但我无法将它们放在运行在 Windows Seven 中的主机上,我将它们放在可执行文件旁边,并且应用程序成功运行并且以前的错误消失了,但是,QMainWindow 仍然是BLACK,并且我的调试器在运行时出现以下错误。

QOpenGLShaderProgram: could not create shader program
QOpenGLShader: could not create shader
bool __thiscall QOpenGLTextureBlitter::create(void) Could not link shader program:

现在怎么了?

更新 3

这就是我配置QT的方式。

configure -release -opensource -opengl dynamic -target xp -platform win32-msvc2013 -icu -nomake examples -prefix C:\QT-Compile

我使用了windeployqt.exe 并将所需的 DLL 和 ... 放在可执行文件旁边。

在 windows xp 中运行应用程序,我不断收到以下错误,然后应用程序崩溃。

消息框:

The procedure entry point strnlen could not be located in the dynamic link library msvcrt.dll

QT 调试器:

class QWindowsEGLStaticContext *__cdecl QWindowsEGLStaticContext::create(class QFlags<enum QWindowsOpenGLTester::Renderer>): Could not initialize EGL display: error 0x3001

class QWindowsEGLStaticContext *__cdecl QWindowsEGLStaticContext::create(class QFlags<enum QWindowsOpenGLTester::Renderer>): When using ANGLE, check if d3dcompiler_4x.dll is available
Failed to load opengl32sw.dll (The specified module could not be found.)
class QOpenGLStaticContext *__cdecl QOpenGLStaticContext::create(bool): Failed to load and resolve WGL/OpenGL functions

【问题讨论】:

【参考方案1】:

关于msvcrt.dll 的第一个错误是关于二进制文件中不包含Visual Studio 运行时dll。似乎在 win XP 机器上,这些库与您的应用所链接的库不同

接下来的两个错误是关于未能启动 ANGLE 可能是由于您之前遇到的 MS VS 运行时不匹配。

基本上,只需将 msvcr110.dll 和 msvcp110.dll 放在您的文件夹中(或提供安装 MS VS Redistributable for 2013 Studio 的方法)

这里是 digia 的详细部署文档 - http://doc.qt.io/qt-5/windows-deployment.html

我还建议您使用 qt 的工具 windeployqt.exe 作为部署过程的一部分。 用法很简单——windeployqt.exe path/to/your/binary/file.exe

它将复制您的应用程序在任何地方运行应用程序所需的几乎所有内容,而不会打扰您包含一些插件和 dll 等(尽管它不会复制上面提到的 MSVS 运行时 dll)

另外,如果您对使用不同的 opengl 为 qt5 构建动态加载图形驱动程序感兴趣(尝试使用默认 opengl -> 失败尝试使用 ANGLE -> 如果失败,尝试使用 opengl 软件 (libmesa)) - http://doc.qt.io/qt-5/windows-requirements.html#dynamically-loading-graphics-drivers

它比 Qt4 复杂一些,但是当你最终正确处理它时,即使在没有图形驱动程序或没有直接 X 支持或通过 *** 启动的机器上,它也会更加安全

更新

似乎桌面 opengl 和 ANGLE 对您来说都失败了(这意味着您的 OpenGL 实现版本低于 3.0(win xp 上默认为 2.0),桌面 opengl 失败并且您没有 DirectX 11 或安装了 DirectX 9 正确的驱动程序(对于 ANGLE 失败)。

这意味着这是没有任何驱动程序的虚拟机或窗口。要解决此问题,请将 opengl32sw.dll (libmesa) 也包含到您的可执行文件中。这是桌面和 ANGLE 都失败的另一个后备方案。

您可以从文件夹/tools 中安装QtCreator 的文件夹中获取。或在这里下载 - http://download.qt.io/development_releases/prebuilt/llvmpipe/windows/ 取决于你的拱门。

另外,尝试将您的 win xp 中的d3dcompiler_46.dll 放在您的可执行文件旁边。这可能会修复运行时错误并允许启动 ANGLE - https://bugreports.qt.io/plugins/servlet/mobile#issue/QTBUG-44985

更新 2:

让我们逐行获取它。 您收到了The procedure entry point strnlen could not be located in the dynamic link library msvcrt.dll 警告,因为您的 win XP 不是 SP3,而是 SP2(微软放弃了对 MSVS 2013 的 win XP SP2 的支持) - 更多详细信息 here 存在同样的问题。或者有同样的错误here 基本上建议使用 opengl 软件。

现在,您在日志中看到的错误:

    class QWindowsEGLStaticContext *__cdecl QWindowsEGLStaticContext::create(class QFlags&lt;enum QWindowsOpenGLTester::Renderer&gt;): Could not initialize EGL display: error 0x3001 - 这是 OpenGL 桌面的故障,因为您没有 Open GL 2.0 -> 正确的图形驱动程序。

    class QWindowsEGLStaticContext *__cdecl QWindowsEGLStaticContext::create(class QFlags&lt;enum QWindowsOpenGLTester::Renderer&gt;): When using ANGLE, check if d3dcompiler_4x.dll is available - ANGLE 失败。因为要么 - qt 将 mvcrt.dll 用于不再支持您的 Win XP SP2 的 MSVS 2013,或者您没有 d3dcompiler。也许它适用于使用 MSVS 2008 或 MSVS 2012 构建的 Qt 5.4。

Failed to load opengl32sw.dll (The specified module could not be found.) class QOpenGLStaticContext *__cdecl QOpenGLStaticContext::create(bool): Failed to load and resolve WGL/OpenGL functions - 这些错误与缺少 opengl32sw.dll 文件有关。我已经提供了链接供您下载并放入可执行文件。

应用程序崩溃是因为 Qt 根本无法运行任何 OpenGL 模式。所以基本上你能做的就是强制应用程序使用 OpenGL 软件(我多次为你提供了如何做到这一点的链接,请阅读这些指南。)或使用 qt 5.4 并尝试运行角度。 OpenGL 软件可能运行不顺畅,并且在复杂的图形界面方面存在一些问题,但这基本上是唯一剩下的事情了。

【讨论】:

我已经在win xp机器上安装了Microsoft Visual C++ 2013 Redistributable Package x86 还复制了你在应用程序目录中提到的DLL,我仍然有程序入口点strnlen无法位于动态链接库msvcrt中.dll 错误。此外,基于 qt windows 部署,我的应用程序需要的所有 DLL 都在正确的位置,但我仍然遇到角度错误。感谢您的回复 我也使用了windeployqt.exe并在win xp机器上测试过,我也有同样的错误。 opengl32sw 和 d3dcompiler_46.dll 在可执行文件的目录中,我仍然有问题。恐怕 ANGLE 根本不适合在 XP 上运行。 使用本指南 - doc.qt.io/qt-5/… 回复。那个臭名昭著的错误“无法在动态链接库 msvcrt.dll 中找到过程入口点 strnlen”:我刚刚测试了 Qt 5.6 Beta,它消失了 :-)【参考方案2】:

我们在win 7中遇到了同样的问题,通过安装显卡驱动解决了

【讨论】:

【参考方案3】:

我找到了另一种解决方案作为从 opengl 切换到软件光栅化器并删除这些消息的辅助选项:

Could not initialize EGL display: error 0x3001
When using ANGLE, check if d3dcompiler_4x.dll is available

因为在我的情况下,VirtualBox 环境当前在 OpenGL/DirectX (https://forums.virtualbox.org/viewtopic.php?t=82614&start=15#p408392) 实现方面存在问题,所以我试图寻找解决方案并以某种方式解决渲染问题。

QT 本身有一个选项可以切换或禁用几个内置选项,而无需重新构建任何内容。如这里描述的: https://doc.qt.io/qt-5/windows-requirements.html#dynamically-loading-graphics-drivers

可以提供 JSON 格式的配置文件,根据显卡和驱动程序版本指定要使用的 OpenGL 实现。该位置由环境变量 QT_OPENGL_BUGLIST 给出。使用 QLibraryInfo::SettingsPath 或 QStandardPaths::ConfigLocation 解析相对路径。该文件利用了 Chromium 项目中使用的驱动程序错误列表的格式。它由一个条目列表组成,每个条目都指定一组条件和一个特征关键字列表。通常,设备 ID 和供应商 ID 用于匹配特定的显卡。它们可以在 qtdiag 或 dxdiag 工具的输出中找到。

qtdiag 工具基本上存储在qmake 可执行文件附近。您还可以运行它来诊断终端系统的其他错误。

对于 VirtualBox,你可以试试这个:


  "entries": [
    
      "id": 1,
      "description": "Software OpenGL rasterizer (opengl32sw.dll)",
      "os": 
        "type": "win"
      ,
      "vendor_id": "0x80EE",
      "device_id": ["0xBEEF"],
      "driver_version": 
        "op": "<=",
        "value": "5.1.38.22592"
      ,
      "features": [
        "disable_desktopgl", "disable_angle"
      ]
    
  ]

,地点:

disable_desktopgl, disable_angle - 当不需要加速路径时。这确保了 Qt 尝试的唯一选项是软件光栅化器 (opengl32sw.dll)。可用于部署在各种旧系统上的虚拟机和应用程序。

5.1.38.22592 是 VirtualBox 的一个版本。

这可能不是您搜索的内容,但我自己没有及时找到。

【讨论】:

以上是关于无法在 Windows XP 中运行使用 QT5 和 VS2013 创建的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

错误:Qt5 视频渲染错误代码 80040218

如何在 windows xp 上部署 Qt 5.10 Quick 2 应用程序?

如何在Windows XP上部署Qt 5.10 Quick 2应用程序?

windows 安装程序可以默认程序使用 XP 兼容模式吗?

VS2012 nmake使用v110_xp工具集?

将 QT WebKitWidgets 应用程序部署到 Windows XP