【问题标题】:Delay-loading of opengl32.dll fails with Qt5Qt5 延迟加载 opengl32.dll 失败
【发布时间】:2014-04-03 17:10:59
【问题描述】:

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

为了让它工作,我尝试延迟加载 opengl32.dll,方法是设置 /DELAYLOAD: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?

【问题讨论】:

  • 让您的 QT 应用程序在一开始就使用 LoadLibrary 加载您自己的 OpenGL32.dll。知道应用程序只能加载一个指定名称的模块,它将无法加载 system32 中的模块,因为它已经加载了您的模块。如果应用程序静态链接OpenGL32,您将遇到困难,可能不得不求助于挂钩。
  • 没有使用 OpenGL 的 Qt5 包没有选项吗?我不确定,但我记得看到标有 Qt 5.2 OpenGL 之类的版本和一个没有 OpenGL 的版本。
  • @Skali 使用非 openGL 版本的 Qt 不是一个选项,因为我依靠 OpenGLSurface 来绘制 QWindow 并且我正在使用像 QOpenGLShaderProgram 这样的所有好帮手和朋友。 @CantChooseUsernames 不幸的是,LoadLibrary 也不起作用,因为 Qt5Gui.dll 似乎导致系统 opengl32.dll 在加载时被链接,所以当调用 main() 时,所有的伤害都已经完成。有哪些钩子可以提供帮助的想法?
  • 我不知道这需要付出多少努力,但是你能改变 Qt 源代码中 opengl32.dll 的链接吗?我没有在一个项目中使用过 OpenGL 和 Qt(仅分别)。
  • 为什么不使用软件渲染来渲染纹理,然后将其传递给内置的 OpenGL 库? (在四边形上渲染纹理基本上是任何 OpenGL 中的保证功能)

标签: c++ windows opengl qt5 mesa


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2010-11-26
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 2018-02-27
    • 2021-05-06
    • 2011-04-18
    • 2021-11-23
    • 1970-01-01
    相关资源
    最近更新 更多