web-dev-qa-db-fra.com

Comment compiler un projet GLUT + OpenGL avec CMake et Kdevelop sous Linux?

Comme le titre l'indique, je n'arrive pas à construire le projet avec OpenGL et Glut.

J'obtiens des erreurs de référence non définies pour les fonctions OpenGL.

J'ai essayé de faire:

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

Mais ça ne marche pas.

Aucune suggestion?

34
Ren

find_package(OpenGL) trouvera le package pour vous, mais il ne le relie pas à la cible.

Pour créer un lien vers une bibliothèque, vous pouvez utiliser target_link_libraries(<target> <item>). De plus, vous devez également définir le include directory, Afin que l'éditeur de liens sache où chercher les choses. Cela se fait avec le include_directories.

Un exemple CMakeLists.txt Qui ferait cela ressemble à ceci:


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} )

Si OpenGL est une nécessité pour votre projet, vous pouvez envisager de tester OpenGL_FOUND Après la find_package(OpenGL) ou d'utiliser REQUIRED, ce qui arrêtera cmake si OpenGL est introuvable.

Pour plus d'informations et de meilleurs exemples:

En particulier, les liens CMake wiki Et cmake and opengl Devraient vous en donner assez pour que les choses fonctionnent.

77
simont

Dans les versions récentes de CMake (3.10+), il existe une nouvelle façon d'utiliser OpenGL en utilisant ce que l'on appelle cible IMPORTÉE:

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} )

Pour le moment, la seule différence pratique semble être sur Linux (où GLVND est utilisé si disponible), mais cette solution devrait probablement être plus évolutive, car CMake a plus d'informations sur vos intentions et d'autres outils analysant vos CMakeFiles comprendront mieux la arbre de dépendance.

3
minexew