Как скомпилировать проект GLUT + OpenGL с CMake и Kdevelop в Linux?
Как видно из заголовков, я не могу построить проект с OpenGL и Glut.
Я получаю неопределенные ошибки ссылок для функций OpenGL.
Я пытался сделать:
project(testas)
find_package(OpenGL)
find_package(GLUT)
add_executable(testas main.cpp)
Но это не работает.
Какие-либо предложения?
4 ответа
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 2.8, target_link_libraries
- Документация CMake 2.8, find_package
- CMake Wiki: как найти библиотеки
- Сообщение на форуме с решением: cmake и opengl
- Учебник для CMake от swarthmore.edu
В частности, CMake wiki
а также cmake and opengl
ссылки должны дать вам достаточно, чтобы все заработало.
В последних версиях 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, будут лучше понимать дерево зависимостей.
С недавнего времени вы можете использовать
GLUT::GLUT
:
cmake_minimum_required(VERSION 2.8)
project(testas)
add_executable(testas main.cpp)
find_package(OpenGL REQUIRED)
find_package(GLUT REQUIRED)
target_link_libraries(testas OpenGL::GL GLUT::GLUT)
Я использую эти два файла 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)