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

v_j*_*han 5 c++ opengl glew dynamic cmake

我正在将 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
Run Code Online (Sandbox Code Playgroud)

这是链接库的 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})
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢!

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

v_j*_*han 4

问题是在 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})
Run Code Online (Sandbox Code Playgroud)

这就解决了它!:)