Qt 5.5.0 找不到 OpenGL 函数

Posted

技术标签:

【中文标题】Qt 5.5.0 找不到 OpenGL 函数【英文标题】:Qt 5.5.0 cannot find OpenGL functions 【发布时间】:2015-07-26 03:38:22 【问题描述】:

我有一个使用 OpenGL 的 Qt 项目,并且可以在 Qt 5.4.0 中正常编译。今天我将我的 Qt 升级到 5.5.0,我的项目停止编译。如您在此处看到的,它会引发很多 unresolved external symbol 错误:

link /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /MANIFEST:embed /OUT:debug\UI.exe @C:\Users\DWilches\AppData\Local\Temp\UI.exe.376.5500.jom
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol __imp__glBegin@4 referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::paintGL(void)" (?paintGL@UIOpenGLVisualizer@@UAEXXZ)
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol __imp__glClearDepth@8 referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::initializeGL(void)" (?initializeGL@UIOpenGLVisualizer@@UAEXXZ)
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol __imp__glColor3f@12 referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::paintGL(void)" (?paintGL@UIOpenGLVisualizer@@UAEXXZ)
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol __imp__glColor4f@16 referenced in function "private: void __thiscall UIOpenGLVisualizer::PaintScene(void)" (?PaintScene@UIOpenGLVisualizer@@AAEXXZ)
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol __imp__glEnd@0 referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::paintGL(void)" (?paintGL@UIOpenGLVisualizer@@UAEXXZ)
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol __imp__glFrustum@48 referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::paintGL(void)" (?paintGL@UIOpenGLVisualizer@@UAEXXZ)
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol __imp__glInitNames@0 referenced in function "public: void __thiscall UIOpenGLVisualizer::NewSelectionPerformed(void)" (?NewSelectionPerformed@UIOpenGLVisualizer@@QAEXXZ)
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol __imp__glLineStipple@8 referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::initializeGL(void)" (?initializeGL@UIOpenGLVisualizer@@UAEXXZ)
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol __imp__glLoadIdentity@0 referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::initializeGL(void)" (?initializeGL@UIOpenGLVisualizer@@UAEXXZ)
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol __imp__glLoadName@4 referenced in function "public: void __thiscall UIOpenGLVisualizer::NewSelectionPerformed(void)" (?NewSelectionPerformed@UIOpenGLVisualizer@@QAEXXZ)
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol __imp__glMatrixMode@4 referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::initializeGL(void)" (?initializeGL@UIOpenGLVisualizer@@UAEXXZ)
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol __imp__glOrtho@48 referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::initializeGL(void)" (?initializeGL@UIOpenGLVisualizer@@UAEXXZ)
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol __imp__glPointSize@4 referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::initializeGL(void)" (?initializeGL@UIOpenGLVisualizer@@UAEXXZ)
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol __imp__glPushName@4 referenced in function "public: void __thiscall UIOpenGLVisualizer::NewSelectionPerformed(void)" (?NewSelectionPerformed@UIOpenGLVisualizer@@QAEXXZ)
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol __imp__glRenderMode@4 referenced in function "public: void __thiscall UIOpenGLVisualizer::NewSelectionPerformed(void)" (?NewSelectionPerformed@UIOpenGLVisualizer@@QAEXXZ)
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol __imp__glRotatef@16 referenced in function "public: void __thiscall UIOpenGLVisualizer::NewSelectionPerformed(void)" (?NewSelectionPerformed@UIOpenGLVisualizer@@QAEXXZ)
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol __imp__glScalef@12 referenced in function "public: void __thiscall UIOpenGLVisualizer::NewSelectionPerformed(void)" (?NewSelectionPerformed@UIOpenGLVisualizer@@QAEXXZ)
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol __imp__glSelectBuffer@8 referenced in function "public: void __thiscall UIOpenGLVisualizer::NewSelectionPerformed(void)" (?NewSelectionPerformed@UIOpenGLVisualizer@@QAEXXZ)
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol __imp__glTranslatef@12 referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::paintGL(void)" (?paintGL@UIOpenGLVisualizer@@UAEXXZ)
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol __imp__glVertex3f@12 referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::paintGL(void)" (?paintGL@UIOpenGLVisualizer@@UAEXXZ)
debug\UI.exe : fatal error LNK1120: 20 unresolved externals
jom: C:\Users\DWilches\Desktop\3DIA\VolumeSelector\VVSIT\build-VVSIT-Desktop_Qt_5_5_0_MSVC2013_32bit-Debug\UI\Makefile.Debug [debug\UI.exe] Error 1120
jom: C:\Users\DWilches\Desktop\3DIA\VolumeSelector\VVSIT\build-VVSIT-Desktop_Qt_5_5_0_MSVC2013_32bit-Debug\UI\Makefile [debug] Error 2
21:35:43: The process "C:\ProgramFiles\Qt\Qt5.5.0\Tools\QtCreator\bin\jom.exe" exited with code 2.
Error while building/deploying project VVSIT (kit: Desktop Qt 5.5.0 MSVC2013 32bit)
When executing step "Make"

我没有在 Qt 的一个版本和另一个版本之间修改 .pro 文件。我的 .pro 也有这样的行:

QT += opengl

可能出了什么问题?

【问题讨论】:

您需要传递opengl32.lib 才能链接。您正在使用响应文件,因此您希望将其放在那里而不是命令行,而且我不知道如何使用您的特定工具来控制响应文件,但 opengl32.lib 是导入库在哪里可以找到这些函数。 是的,谢谢,我添加了 -lopengl32,现在它可以工作了。我想知道为什么现在有必要使用这个新版本的 Qt,而之前它似乎是由:QT += opengl 自动完成的。您可以将此添加为答案吗? 我不知道QT += opengl 在不同版本中做什么或不做什么,所以我写的任何答案都不会很完整。你为什么不写一个自我回答来说明你是如何/在哪里添加 -lopengl32 以使它与 Qt 构建过程很好地配合? 【参考方案1】:

正如@Ben-Voigt 在上面的 cmets 中所揭示的,我必须明确指示 Qt 链接到 opengl32,所以我在我的 .pro 中添加了以下内容:

LIBS += -lopengl32

我不确定为什么 Qt 5.5.0 的行为会发生变化,因为该行在以前的版本中是不必要的,但是它解决了问题。

【讨论】:

如果我不得不猜测,在 qt 中有一个硬编码检查,用适当的系统特定库替换 opengl,不知何故在 5.5 中被破坏了。但是我不使用 qt(或 opengl),所以这只是一个猜测。我会在他们的论坛上将此报告为错误。 @Blindy:当谈到 OpenGL 时,没有系统特定库之类的东西(是的,我知道,在 Linux 中,供应商专有驱动程序会安装自己的 libGL.so)。支持 OpenGL 的操作系统的 ABI 被固定,并且遵循这些 ABI 的任何 DLL/SO 将在运行时与您的程序链接就好(假设程序本身也遵守 ABI)。 @Blindy:我认为像你所说的那样发生了什么事,检查一下:blog.qt.io/blog/2015/07/01/qt-5-5-released,特别是:在 Windows 上使用 OpenGL 总是有些问题,因为在 Windows 中没有好的驱动程序可用默认情况下所有安装。 Qt 5.5 通过在使用 OpenGL 驱动程序或在 DirectX 之上实现 OpenGL 的 ANGLE 仿真层之间动态切换来帮助解决这个问题。 @datenwolf,不知道你的意思是什么——Linux 通常使用libGL,Windows opengl32.lib,这些是系统特定的名称。当然,您可能只是在争论听到自己说话,所以您可以忽略它。 @Mondkin 是的,这有点道理。很好,这意味着它很有可能会在补丁或下一个版本中修复。 @Blindy:哦,我认为你的评论是“在 Linux 中,每个 OpenGL 驱动程序都带来了他的 libGL.so”,有些人误认为该程序必须链接到特定的 libGL.so 或使用dlopen/dlsym 来解析符号(在古代确实是这样,但后来 LSB 确定了 ABI 要求,从那以后这一直不是问题)。无论如何,当我们了解系统细节时,MacOS X 上有-framework OpenGL;然而,所有这些应该在 Qt 的 qmake 中抽象出来(它肯定在 CMake 的 FindOpenGL.cmake 模块中)。

以上是关于Qt 5.5.0 找不到 OpenGL 函数的主要内容,如果未能解决你的问题,请参考以下文章

在linux2.6内核中为啥找不到inet

Pyinstaller 找不到 opengl 的渲染器插件

Qt5 Linux 找不到 Qt 库

drools 5.5.0 错误 - 找不到元素“更改集”的声明

QtWebEngine - 找不到过程

Qt 5.6 中的 Opengl