![](/img/trans.png)
[英]Undefined Reference to Symbol '<Symbol>' ... Error Adding Symbols: DSO Missing From Command Line (With CMake)
[英]GLEW + cmake linking fails “undefined reference to symbol glDrawElements” + “DSO missing from command line”
我將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-Creator)
我認為在閱讀了這個問題的答案后,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,我們會遇到“未定義的引用”問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.