我使用QT5
和Visual 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
答案 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软件。
现在,您在日志中看到的错误:
class QWindowsEGLStaticContext *__cdecl QWindowsEGLStaticContext::create(class QFlags<enum QWindowsOpenGLTester::Renderer>): Could not initialize EGL display: error 0x3001
- 这是OpenGL桌面的失败,因为你没有Open GL 2.0 - &gt;适当的图形驱动程序。
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。
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的版本。这可能不是您要搜索的内容,但我没有及时为自己找到它。