将 Qt4 移植到 Qt5,获取 OpenGL 调用的未解析外部符号

Porting Qt4 to Qt5, getting unresolved external symbols for OpenGL calls

提问人:waterrockets 提问时间:4/19/2014 更新时间:5/3/2014 访问量:961

问:

这是在 Visual Studio 2010 中。我在任何地方都找不到任何文档说明哪个库包含这些函数。我已经将这些库列为依赖项:

    Qt5OpenGL.lib;Qt5Gui.lib;Qt5Widgets.lib;qtmaind.lib;Qt5Cored.lib;Qt5Guid.lib;Qt5OpenGLd.lib;Qt5Sqld.lib;Qt5Networkd.lib;opengl32.lib;glu32.lib

我很感激这里的任何帮助,因为我被困住了。

1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glDeleteProgramsARB@8
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glDeleteShader@4
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glDeleteProgram@4
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glDetachShader@8
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glDeleteBuffersARB@8
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glUnmapBufferARB@4
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glBindBufferARB@8
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glMapBufferARB@8
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glActiveTexture@4
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glUseProgram@4
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glProgramLocalParameter4fARB@24
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glUniform4f@20
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glGetUniformLocation@8
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glUniform1i@8
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glLinkProgram@4
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glAttachShader@8
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glCreateProgram@0
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glCompileShader@4
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glShaderSource@16
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glCreateShader@4
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glGetShaderInfoLog@16
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glGetShaderiv@12
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glGetProgramInfoLog@16
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glGetProgramiv@12
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glProgramStringARB@16
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glBindProgramARB@8
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glGenProgramsARB@8
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glBufferDataARB@16
1>videograph_opengld.lib(videorenderer.obj) : error LNK2001: unresolved external symbol _glGenBuffersARB@8
C++ 可视化工作室 2010 opengl qt5 未解析外部

评论


答:

-1赞 Syntactic Fructose 4/19/2014 #1

你可能缺少一些其他关键依赖项,请打开“属性”->“链接器”-“输入”>“,并将”其他依赖项“设置为

  • opengl32.lib
  • glu32.lib
  • delayimp.lib 文件
  • imm32.lib
  • winmm.lib

另外,无论您目前拥有什么,我使用的参考资料都可能已经过时,您可以在这里找到它

评论

1赞 datenwolf 4/19/2014
这些符号,OP 构建是缺失的,你会在 Windows 中根本找不到。它们是现代配置文件 OpenGL 函数,只能通过 OpenGL 扩展机制访问。.lib
2赞 datenwolf 4/19/2014 #2

链接器报告缺少的符号实际上不包含在 Windows 中可以链接到的任何库中。它们是现代 OpenGL 配置文件和扩展函数,需要在创建 OpenGL 上下文后在运行时加载。

你被报告这些符号丢失表明,在构建你正在使用的库时,有些东西已经非常严重地搞砸了;或者该库的作者不太关心与其他项目的无缝集成。videograph

请注意,使用像 GLEW 这样的扩展加载器-包装器库可能对您没有帮助,因为这些库必须初始化,例如通过调用 ,但库是一种黑匣子,因此您不知道何时调用它。您可以尝试与 GLEW 链接,并在您具有 OpenGL 上下文但 YMMV.glewInitglewInit()

评论

0赞 waterrockets 4/24/2014
好的,我明白你在说什么了,谢谢。从那以后,我意识到有问题的调用在另一个库中,并且该库很好地链接了有问题的 .obj。问题在于 videograph 库依赖于另一个库,并且出于某种原因尝试静态链接这些调用。非常令人困惑。
0赞 waterrockets 5/3/2014
我想通了。有一个 #ifdef Q_WS_WIN 包装器来命名 DLL 的函数,但未定义。Qt 在 Qt5 中改为 Q_OS_WIN,因此进行替换解决了问题。
0赞 waterrockets 5/3/2014 #3

有一个 #ifdef Q_WS_WIN 包装器来命名 DLL 的函数,但未定义。Qt 在 Qt5 中改为 Q_OS_WIN,因此进行替换解决了问题。