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

时间:2015-12-23 12:53:42

标签: qt visual-studio-2013 angle msvcrt windows-xp-sp3

我使用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会弹出,但它完全是BLACK,我在调试器中看到以下错误。

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

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

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

3 个答案:

答案 0 :(得分:0)

关于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建立动态加载图形驱动程序的帖子(尝试使用默认的opengl - &gt;失败尝试使用ANGLE - &gt;如果失败,尝试使用opengl软件(libmesa) )) - http://doc.qt.io/qt-5/windows-requirements.html#dynamically-loading-graphics-drivers

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

更新

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

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

您可以从文件夹/工具中安装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警告,因为您已经获得了XP而不是SP3但是SP2(微软放弃了对MSVS 2013的win XP SP2的支持) - 更多细节here其中存在同样的问题。或者有相同的错误here基本上建议使用opengl软件。

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

  1. class QWindowsEGLStaticContext *__cdecl QWindowsEGLStaticContext::create(class QFlags<enum QWindowsOpenGLTester::Renderer>): Could not initialize EGL display: error 0x3001 - 这是OpenGL桌面的失败,因为你没有Open GL 2.0 - &gt;适当的图形驱动程序。

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

  3. 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模式。所以你基本上所能做的就是强迫app使用OpenGL软件(我为你提供了如何多次这样做的链接,请阅读这些指南。)或者使用qt 5.4并尝试运行角度。 OpenGL软件可能无法顺利运行并且在复杂的图形界面上存在一些问题,但这基本上是唯一剩下的东西。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我已经找到另一种解决方案,作为从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的版本。

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