GLEW + cmake 链接失败“未定义对符号 glDrawElements 的引用”+“命令行中缺少 DSO”

Posted

技术标签:

【中文标题】GLEW + cmake 链接失败“未定义对符号 glDrawElements 的引用”+“命令行中缺少 DSO”【英文标题】:GLEW + cmake linking fails "undefined reference to symbol glDrawElements" + "DSO missing from command line" 【发布时间】:2015-07-06 15:16:40 【问题描述】:

我正在将 GLEW、SDL2 和 Assimp 与 Cmake 相关联。在构建 .o 文件时似乎工作正常,但是在链接它们时出现这些错误

:-1: error: CMakeFiles/"Projectpath".cpp.o: undefined reference to symbol 'glDrawElements'
/usr/lib/x86_64-linux-gnu/mesa/libGL.so.1:-1: error: error adding symbols: DSO missing from command line
:-1: error: collect2: error: ld returned 1 exit status

这是链接库的 Cmakefile 部分

find_package(OpenGL)
find_package(GLEW)
find_package(SDL2)
find_package(Assimp)
#Include(FindPkgConfig)
#PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2)
set(INCLUDE_DIRS $OpenGL_INCLUDE_DIRS $SDL2_INCLUDE_DIRS $GLEW_INCLUDE_DIRS $Assimp_INCLUDE_DIRS)
set(LIBS $LIBS $OpenGL_LIBRARIES $SDL2_LIBRARIES $GLEW_LIBRARIES $Assimp_LIBRARIES )
include_directories($INCLUDE_DIRS)

target_link_libraries($PROJECT_NAME $LIBS)

我在阅读时尝试更改链接顺序,这可能是个问题。 我还添加了 OpenGL 的东西,因为错误中有 libGL 的东西,它似乎不起作用。 我还阅读了有关使用 pkg-config --print-requires --print-requires-private glew 检查依赖关系的信息,但问题是它依赖于 20 个不同的库。我需要链接所有这些吗?

并不是我没有正确的库,我上周在这台计算机上创建了一个基本的 OpenGL 程序并且运行良好(我使用了另一种链接我的库的方式,并且还使用了 Code::Blocks 而不是 Qt-创作者)

在阅读this question 的答案后,我认为 DSO 是问题所在。 但这不应该意味着在 cmakefile 中做 OpenGL 的事情来修复它吗?

谢谢!

编辑:我可以创建 VertexArrays、VertexBuffers 等。但只要我添加对其中任何一个的调用。 glDrawElements(...)glDrawArrays(...) 我得到了那个错误。 (我也可能在其他一些函数上遇到该错误,但这是我在尝试渲染基本网格时唯一遇到该错误的那些)

【问题讨论】:

【参考方案1】:

问题在于 OpenGL_INCLUDE_DIRS 和 OpenGL_LIRARIES 实际上是 OPENGL_INCLUDE_DIRS(

find_package(OpenGL)
find_package(GLEW)
find_package(SDL2)
find_package(Assimp)
#Include(FindPkgConfig)
#PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2)
set(INCLUDE_DIRS $INCLUDE_DIRS $OPENGL_INCLUDE_DIRS $SDL2_INCLUDE_DIRS $GLEW_INCLUDE_DIRS $Assimp_INCLUDE_DIRS) #<--- Changed this from $OpenGL_INCLUDE_DIRS to $OPENGL_INCLUDE_DIRS (Again not sure I need that variable)
set(LIBS $LIBS $OPENGL_LIBRARY $SDL2_LIBRARIES $GLEW_LIBRARIES $Assimp_LIBRARIES ) #<---(Changed this from $OpenGL_LIBRARIES to $OPENGL_LIBRARY
include_directories($INCLUDE_DIRS)

target_link_libraries($PROJECT_NAME $LIBS)

这就解决了! :)

【讨论】:

【参考方案2】:

我在使用 CMake 配置 GLEW 时遇到了类似的问题,将 http://www.opengl-tutorial.org 的基本教程 #2 应用于测试目的。

我使用的是 GLFW 而不是 SDL,但根本原因是相同的。

使用最近的 CMake (>= 3.1),我们只需要:

find_package(OpenGL REQUIRED)
target_link_libraries( myApp OpenGL::GL )

find_package ( GLEW REQUIRED )
target_link_libraries( myApp GLEW::GLEW )   

正如您所指出的,如果不寻找 openGL,我们会遇到“未定义的引用”问题。

【讨论】:

以上是关于GLEW + cmake 链接失败“未定义对符号 glDrawElements 的引用”+“命令行中缺少 DSO”的主要内容,如果未能解决你的问题,请参考以下文章

无法将 Glew 与 Cmake 链接

将 GLEW 与 CMake 连接起来

链接 GLEW 失败

链接器错误:未定义对符号“glOrtho”的引用

CMake 找不到 GLEW

GLEW 不适用于 CMAKE