GLEW + cmake 链接失败 "undefined reference to symbol glDrawElements" + "命令行缺少 DSO"

6

我正在使用Cmake链接GLEW、SDL2和Assimp。在生成.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})

我尝试更改链接顺序,因为我读到这可能是个问题。由于错误中的libGL问题,我还添加了OpenGL。但似乎不起作用。我还阅读了使用pkg-config --print-requires --print-requires-private glew检查依赖关系,但问题在于它有20多个不同的库依赖于它。我需要链接它们所有吗?
并不是说我没有正确的库,上周我在这台电脑上创建了一个基本OpenGL程序,并且运行良好(我使用了其他方式链接我的库,还使用了Code::Blocks而不是Qt-Creator)。
我认为根据这个问题的答案,DSO可能是问题所在。但这难道不意味着在cmakefile中执行OpenGL操作就可以解决它吗?
谢谢!
编辑:我可以创建VertexArrays、VertexBuffers等。但只要我添加调用glDrawElements(...)glDrawArrays(...),就会出现那个错误。(可能还会在其他函数上遇到该错误,但这些是当我尝试渲染基本网格时遇到该错误的唯一函数)
2个回答

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

并且问题得到了解决! :)

2

我在使用CMake配置GLEW时遇到了类似的问题,正在尝试测试用途下的基础教程#2,该教程来自http://www.opengl-tutorial.org

我正在使用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,我们会遇到“未定义引用”的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接