延迟加载opengl32.dll失败,出现Qt5

Delay-loading of opengl32.dll fails with Qt5

本文关键字:出现 Qt5 失败 opengl32 dll 延迟加载      更新时间:2023-10-16

我需要在Windows 7上的Qt5项目中使用OpenGL版本2的功能(Qt是用桌面OpenGL而不是ANGLE构建的)。为了支持通过远程桌面运行应用程序,如果有必要,我想回到通过Mesa进行软件渲染。我的计划是在启动时检查OpenGl版本。如果它是低,我在应用程序设置中设置一个标志,打印一条消息并终止程序。当程序再次启动时,我可以读取标志,并决定是否需要从Mesa加载opengl32.dll,而不是Windows的内置版本。

为了实现这一点,我尝试通过设置/DELAYLOAD:opengl32.dll链接器标志来延迟加载opengl32.dll,然后使用SetDllDierectoryW([path to dir with Mesa's opengl32.dll])重定向dll查找。不幸的是,这不起作用,因为opengl32.dll的内置版本在输入main()后就已经在内存中了,因此SetDllDirectory没有任何作用。

Dependency Walker向我展示了Qt5Gui.dll本身与opengl32.dll链接,我怀疑这会破坏延迟加载。但是,当我尝试延迟加载Qt5Gui.dll时,由于导入了符号"__declspec(dllimport) public: static struct QMetaObject const QWindow::staticMetaObject" (__imp_?staticMetaObject@QWindow@@2UQMetaObject@@B),链接器失败。我不知道该怎么摆脱它。

我真的需要OpenGL 2,所以似乎没有办法使用Mesa进行软件渲染。但我也无法想出延迟加载的替代方案。每当我想在硬件和软件渲染之间切换时,更改PATH设置似乎不起作用,通过将Mesa的opengl32.dll移入或移出应用程序目录进行切换是不可行的,因为普通用户不应该拥有所需的写入权限。

有没有办法让opengl32.dll的延迟加载与Qt5一起工作?

Qt5Gui本身链接到OpenGL。如果您的应用程序能够延迟加载此库,则可以尝试在不使用系统路径的情况下调用QCoreApplication::setLibraryPaths(),而使用库的路径。

除此之外,您还可以调整qt.conf文件。点击此处阅读:http://qt-project.org/doc/qt-5/qt-conf.html