GLEW + cmake链接失败“未定义引用符号glDrawElements”+“DSO从命令行中丢失”

时间:2015-07-06 15:16:40

标签: c++ opengl dynamic cmake glew

我将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(...)我收到了这个错误。 (我可能也会在其他一些函数上得到错误,但是当我尝试渲染基本网格物体时,这些是我唯一得到的错误)

2 个答案:

答案 0 :(得分: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})

这就解决了! :)

答案 1 :(得分:1)

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

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

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

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

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

正如您所指出的,我们得到了一个未定义的引用&#34;问题,如果不寻找openGL。