8

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

为了让它工作,我尝试通过设置/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 移入或移出应用程序目录进行切换不是一个选项,因为普通用户不应该有所需的写入权限。

有什么方法可以延迟加载使用 Qt5 的 opengl32.dll 吗?

4

1 回答 1

1

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

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

于 2014-08-17T20:12:14.643 回答