Как скомпилировать проект GLUT + OpenGL с CMake и Kdevelop в Linux? - PullRequest
31 голосов
/ 27 февраля 2012

Как видно из заголовков, я не могу построить проект с OpenGL и Glut.

Я получаю неопределенные ошибки ссылок для функций OpenGL.

Я пытался сделать:

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

Но это не работает.

Есть предложения?

Ответы [ 3 ]

72 голосов
/ 27 февраля 2012

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 является необходимостью для вашего проекта, вы можете рассмотреть либо тестирование OpenGL_FOUND послеfind_package(OpenGL) или использование REQUIRED, которое остановит cmake, если OpenGL не будет найдено.

Для получения дополнительной информации и лучших примеров:

В частности, ссылки CMake wiki и cmake and opengl должны дать вам достаточно информации, чтобы все заработало.

3 голосов
/ 19 ноября 2018

В последних версиях CMake (3.10+) появился новый способ использования OpenGL с использованием так называемой цели IMPORTED :

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, будут лучше понять дерево зависимостей.

0 голосов
/ 14 августа 2017

Я использую эти два файла cmake для создания своих проектов OpenGL, и все они работают хорошо.

Я тестирую эти два файла cmake только под Deepin Linux. Deepin Linux - это китайская система Linux, такая как Ubuntu или Debian.

Во-первых, основной 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}
)

Во-вторых, найти файл GLUT cmake в каталоге CMakeModules

# 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...