【问题标题】:How to compile GLUT + OpenGL project with CMake and Kdevelop in linux?如何在 linux 中使用 CMake 和 Kdevelop 编译 GLUT + OpenGL 项目?
【发布时间】:2012-03-16 15:27:22
【问题描述】:

正如标题所说,我似乎无法使用 OpenGL 和 Glut 构建项目。

我得到 OpenGL 函数的未定义引用错误。

我试过了:

project(testas)
find_package(OpenGL)
find_package(GLUT)
add_executable(testas main.cpp)

但这不起作用。

有什么建议吗?

【问题讨论】:

    标签: linux opengl cmake


    【解决方案1】:

    find_package(OpenGL) 会为您找到包,但不会将包链接到目标。

    要链接到库,您可以使用target_link_libraries(<target> <item>)。另外,还需要设置include directory,让链接器知道去哪里找东西。这是通过include_directories 完成的。

    一个示例CMakeLists.txt 会这样做:

    
    cmake_minimum_required(VERSION 2.8)
    
    project(testas)
    add_executable(testas main.cpp)
    find_package(OpenGL REQUIRED)
    find_package(GLUT REQUIRED)
    include_directories( ${OPENGL_INCLUDE_DIRS}  ${GLUT_INCLUDE_DIRS} )
    
    target_link_libraries(testas ${OPENGL_LIBRARIES} ${GLUT_LIBRARY} )
    

    如果您的项目需要OpenGL,您可以考虑在find_package(OpenGL) 之后测试OpenGL_FOUND,或者使用REQUIRED,如果找不到OpenGL,这将停止cmake

    更多信息和更好的例子:

    特别是,CMake wikicmake and opengl 链接应该足以让您正常工作。

    【讨论】:

    • 感谢您的回答。现在我收到错误,它没有找到它们,我确实安装了它们。 /usr/bin/ld: error: cannot find -lOpenGL /usr/bin/ld: error: cannot find -lGLUT
    • 糟糕,答案中的target_link_libraries 输入错误。现在修复它,并检查它是否有效。 :)
    • 我认为链接到OpenGLGLUT 没有问题,那么?这种错误表明没有安装GLUT_XiGLUT_Xmucmake 没有找到它们)。如果您使用的是 Ubuntu,请查看 this link。如果没有,请尝试为您的系统安装GLUT_XiGLUT_Xmu
    • 谢谢!那删除了那些..但还有一个问题仍然存在,这次你也能帮助我吗? pastebin.com/EekEQyfs我感到绝望了。
    • 您可能想要更新您的答案以使用导入的目标,例如target_link_libraries(testas PRIVATE OpenGL::OpenGL GLUT::GLUT)。然后你真的不需要include_directories() 的东西。那时 cmake_minimum 也应该更新,但我真的不记得最小最小值是多少。我猜那是 3.0,用 3.6 你肯定是安全的。
    【解决方案2】:

    在最新版本的 CMake(3.10+)中,有一种使用所谓的 IMPORTED 目标来使用 OpenGL 的新方法:

    cmake_minimum_required(VERSION 3.10)
    
    project(testas)
    add_executable(testas main.cpp)
    find_package(OpenGL REQUIRED COMPONENTS OpenGL)
    find_package(GLUT REQUIRED)
    
    add_dependencies(testas OpenGL::OpenGL)
    include_directories(${GLUT_INCLUDE_DIRS} )
    
    target_link_libraries(testas OpenGL::OpenGL ${GLUT_LIBRARY} )
    

    目前,唯一实际的区别似乎是在 Linux 上(如果可用,则使用 GLVND),但大概这个解决方案应该更具前瞻性,因为 CMake 有更多关于您的意图的信息,并且解析您的 CMakeFiles 的其他工具将更好地理解依赖树。

    【讨论】:

    • 这对我有用 macOS Mojave 10.14.3 与 GitHub 项目 vsthost wtrsltnk
    • 请注意,我必须使用${GLUT_LIBRARIES}(复数)
    • 在 Mac 上(在我的例子中是 Big Sur 11.2),必须退回到 target_link_libraries( testas ${OPENGL_LIBRARIES} ${GLUT_LIBRARY} ),因为 Apple 发布了自己的 OpenGL,没有 OpenGL::OpenGL 目标。
    【解决方案3】:

    最近你可以使用GLUT::GLUT:

    cmake_minimum_required(VERSION 2.8)
    
    project(testas)
    
    find_package(OpenGL REQUIRED)
    find_package(GLUT REQUIRED)
    
    add_executable(${PROJECT_NAME} main.cpp)
    target_link_libraries(${PROJECT_NAME} OpenGL::GL GLUT::GLUT)
    

    【讨论】:

      【解决方案4】:

      我使用这两个 cmake 文件来构建我的 OpenGL 项目,它们都运行良好。

      我只在Deepin Linux下测试这两个cmake文件。 Deepin Linux 是像 Ubuntu 或来自 Debian 的中国本土 Linux 系统。

      一、主CMakeLists.txt

      cmake_minimum_required(VERSION 3.1.0)
      project(project_name)
      
      set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/")
      
      find_package(OpenGL REQUIRED)
      find_package(FREEGLUT REQUIRED)
      find_package(GLEW REQUIRED)
      
      if(NOT ${OPENGL_FOUND})
          message("OPENGL not found")
      endif()
      
      include_directories(
          ${PROJECT_SOURCE_DIR}
          ${FREEGLUT_INCLUDE_DIR}
          ${GLEW_INCLUDE_DIR}
          ${OPENGL_INCLUDE_DIR}
          )
      
      message(${OPENGL_INCLUDE_DIR})
      add_executable(${PROJECT_NAME}  ${PROJECT_SOURCE_DIR}/filename.cpp) 
      target_link_libraries(${PROJECT_NAME} 
      ${OPENGL_LIBRARY}
      ${FREEGLUT_LIBRARY}
      ${GLEW_LIBRARY}
      )
      

      二、在CMakeModules目录下找到GLUT cmake文件

      # Try to find the FREEGLUT library
      #
      # FREEGLUT_INCLUDE_DIR
      # FREEGLUT_LIBRARY
      # FREEGLUT_FOUND
      
      FIND_PATH(
        FREEGLUT_INCLUDE_DIR GL/freeglut.h GL/gl.h GL/glu.h GL/glew.h
        ${CMAKE_INCLUDE_PATH}
        $ENV{include}
        ${OPENGL_INCLUDE_DIR}
        /usr/include
        /usr/local/include
      )
      
      SET(STORE_CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK})
      SET(CMAKE_FIND_FRAMEWORK NEVER)
      
      FIND_LIBRARY(
        FREEGLUT_LIBRARY
        NAMES freeglut_static freeglut glut GL
        PATH
          /opt/local/lib
          ${CMAKE_LIBRARY_PATH}
          $ENV{lib}
          /usr/lib
          /usr/local/lib
      )
      
      SET(CMAKE_FIND_FRAMEWORK ${STORE_CMAKE_FIND_FRAMEWORK})
      
      IF (FREEGLUT_INCLUDE_DIR AND FREEGLUT_LIBRARY)
         SET(FREEGLUT_FOUND TRUE)
      ENDIF (FREEGLUT_INCLUDE_DIR AND FREEGLUT_LIBRARY)
      
      IF (FREEGLUT_FOUND)
         IF (NOT FREEGLUT_FIND_QUIETLY)
            MESSAGE(STATUS "Found FREEGLUT: ${FREEGLUT_LIBRARY}")
         ENDIF (NOT FREEGLUT_FIND_QUIETLY)
      ELSE (FREEGLUT_FOUND)
         IF (FREEGLUT_FIND_REQUIRED)
            MESSAGE(FATAL_ERROR "Could not find FREEGLUT")
         ENDIF (FREEGLUT_FIND_REQUIRED)
      ENDIF (FREEGLUT_FOUND)
      

      【讨论】:

        猜你喜欢
        • 2013-08-24
        • 2020-12-14
        • 2022-01-08
        • 2015-01-06
        • 2017-06-14
        • 2011-07-18
        • 1970-01-01
        • 1970-01-01
        • 2021-06-24
        相关资源
        最近更新 更多