C++ GLEW&x2B;“cmake链接失败”;对符号元素的未定义引用“+&引用;命令行中缺少DSO“;

C++ GLEW&x2B;“cmake链接失败”;对符号元素的未定义引用“+&引用;命令行中缺少DSO“;,c++,opengl,dynamic,cmake,glew,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 com

我正在将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
以下是CMAKE文件中链接库的部分

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是个问题。 但这难道不意味着在CMAKE文件中使用OpenGL就可以修复它吗

谢谢


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

问题是,在OpenGL中,INCLUDE目录和OpenGL目录实际上是OpenGL INCLUDE目录(我在配置GLEW时遇到了类似的问题,使用CMake,将其应用于基础教程#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,我们会遇到“未定义引用”的问题

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

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