GLEW + cmake 链接失败 "undefined reference to symbol glDrawElements" + "DSO missing from command line"

GLEW + cmake linking fails "undefined reference to symbol glDrawElements" + "DSO missing from command line"

我正在 link使用 Cmake 构建 GLEW、SDL2 和 Assimp。在构建 .o 文件时似乎工作正常,但是当 linking 它们时我得到这些错误

:-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

这是 link库

的 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})

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

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

阅读 this question 的答案后,我认为 DSO 是问题所在。 但这不应该意味着在 cmakefile 中执行 OpenGL 操作可以解决问题吗?

谢谢!

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

问题是 OpenGL_INCLUDE_DIRS 和 OpenGL_LIRARIES 实际上是 OPENGL_INCLUDE_DIRS(<-- 不太确定我需要那个,我可能不需要)和 OPENGL_LIBRARY 所以我在问题中遇到的 CmakeFile 片段实际上应该是这样的

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})

然后就解决了! :)

我在使用 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,我们会遇到 "undefined reference" 问题。