我需要在Windows 7的Qt5项目中使用OpenGL版本2功能(Qt是使用桌面OpenGL而不是ANGLE构建的)。为了支持通过远程桌面运行应用程序,我想在必要时通过Mesa回退到软件渲染。我的计划是在启动时检查OpenGl版本。如果它是低,我在应用程序设置中设置一个标志,打印一条消息并终止该程序。当程序再次启动时,我可以读取标志并决定是否需要从Mesa而不是Windows中加载opengl32.dll。内置版。
为了实现这一点,我尝试通过设置/DELAYLOAD:opengl32.dll
链接器标志然后使用SetDllDierectoryW([path to dir with Mesa's opengl32.dll])
重定向dll查找来延迟加载opengl32.dll。不幸的是,这不起作用,因为在输入main()
之后内置版本的opengl32.dll已经在内存中,因此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移入或移出应用程序dir不是一个选项,因为普通用户不应该#39; t具有所需的写权限。
有没有办法让opengl32.dll的延迟加载与Qt5一起使用?
答案 0 :(得分:1)
Qt5Gui本身与OpenGL相关联。如果您的应用程序能够延迟加载此库,则可以尝试使用不使用系统路径的QCoreApplication :: setLibraryPaths(),而是使用库的路径。
除此之外,你可以调整你的qt.conf文件。在此处阅读:http://qt-project.org/doc/qt-5/qt-conf.html