8 votes

Erreur de liaison dans OpenGL en utilisant freeglut dans CLion

Donc, j'utilise freeglut pour essayer de faire quelques trucs openGL, mais je continue à obtenir des erreurs disant que les références sont indéfinies :

CMakeFiles\texture_mapping.dir/objects.a(TextureMapper.cpp.obj): In function `ZN13TextureMapper4initEv':
.../TextureMapper.cpp:20: undefined reference to `glClearColor@16'
.../TextureMapper.cpp:23: undefined reference to `glMatrixMode@4'
.../TextureMapper.cpp:24: undefined reference to `glLoadIdentity@0'
.../TextureMapper.cpp:25: undefined reference to `glOrtho@48'
CMakeFiles\texture_mapping.dir/objects.a(TextureMapper.cpp.obj): In function `ZN13TextureMapper7displayEv':
.../TextureMapper.cpp:45: undefined reference to `glClear@4'
...TextureMapper.cpp:48: undefined reference to `glColor3f@12'
...TextureMapper.cpp:49: undefined reference to `glBegin@4'
...TextureMapper.cpp:52: undefined reference to `glVertex3f@12'
...TextureMapper.cpp:53: undefined reference to `glVertex3f@12'
...TextureMapper.cpp:54: undefined reference to `glVertex3f@12'
...TextureMapper.cpp:55: undefined reference to `glVertex3f@12'
...TextureMapper.cpp:58: undefined reference to `glEnd@0'
...TextureMapper.cpp:61: undefined reference to `glFlush@0'

J'utilise MinGW avec CLion pour réaliser ce projet. Je pensais que tout était correct. J'ai déplacé les fichiers appropriés dans le répertoire include dans MinGW, ainsi que le dossier bin ainsi que le dossier lib dossier. Ensuite, j'ai ceci dans mon CMakeLists.txt :

cmake_minimum_required(VERSION 3.3)
project(texture_mapping)
find_package(OpenGL REQUIRED)
find_package(GLUT REQUIRED)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES main.cpp TextureMapper.cpp TextureMapper.h Vertex.h ObjParser.cpp ObjParser.h)

add_executable(texture_mapping ${SOURCE_FILES})
target_link_libraries(texture_mapping libfreeglut.a libfreeglut_static.a)

Les bibliothèques que j'ai liées étaient les seuls fichiers de bibliothèque fournis avec freeglut.

Alors, qu'est-ce que je rate ? CLion ne montre pas d'erreurs avant la compilation. Je peux même aller dans les fonctions dans les fichiers d'en-tête fournis par freeglut. Pourquoi alors, ces fonctions ne sont-elles pas définies dans mon programme ?

1voto

Sergey Points 5017

Vous n'avez pas réellement lié OpenGL à votre projet, vous obtenez donc des références non définies aux fonctions OpenGL. Essayez de remplacer

target_link_libraries(texture_mapping libfreeglut.a libfreeglut_static.a)

avec

target_link_libraries(texture_mapping libfreeglut.a libfreeglut_static.a GL)

J'ai reproduit votre problème avec votre CMakeLists.txt et le programme suivant :

#include <GL/gl.h>

int main() {
        glClear(GL_COLOR_BUFFER_BIT);
        return 0;
}

et l'a résolu avec le remplacement ci-dessus. La solution lie automatiquement la bibliothèque GL à partir de mon chemin de bibliothèque :

$ ls -1 /usr/lib64/libGL.*
/usr/lib64/libGL.la
/usr/lib64/libGL.so
/usr/lib64/libGL.so.1
/usr/lib64/libGL.so.1.0.0

UPDATE

Selon este vous disposez de quelques variables pour accéder à vos bibliothèques OpenGL actuelles. Par exemple, vous pouvez pointer directement vers le(s) fichier(s) de la bibliothèque OpenGL comme ceci :

target_link_libraries(texture_mapping libfreeglut.a libfreeglut_static.a ${OPENGL_gl_LIBRARY})

Vous pouvez également ajouter le répertoire de la bibliothèque OpenGL à l'adresse suivante chemin de recherche de la bibliothèque (faites-le avant target_link_libraries ) :

link_directories(${OPENGL_gl_LIBRARY})

1voto

InstantCrush Points 66

J'ai lutté avec le même problème et je l'ai résolu en ajoutant les lignes suivantes à CMakeLists.txt :

find_package(OpenGL REQUIRED)
find_package(GLUT REQUIRED)
include_directories(${OPENGL_INCLUDE_DIRS} ${GLUT_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${OPENGL_LIBRARIES} ${GLUT_LIBRARY})

0voto

EmmanuelMess Points 135

Réorganisation de la CMakeLists.txt m'a aidé ( <name> doivent être remplacés en conséquence) :

cmake_minimum_required(VERSION 3.10)
project(<name>)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lGL -lGLU -lglut")
set(CMAKE_CXX_STANDARD 17)

add_executable(<name> main.cpp)

find_package(OpenGL REQUIRED)
find_package(GLUT REQUIRED)
include_directories(${OPENGL_INCLUDE_DIRS} ${GLUT_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${OPENGL_LIBRARIES} ${GLUT_LIBRARY})

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X