Résolution de l’erreur undefined reference to gluOrtho2D pour le développement Open gl .
Dans mon développement graphique en suivant un tutoriel sur OpenGL , je suis arrivé à être bloqué par une erreur. L’erreur en question est :
Opengl - undefined reference to gluOrtho2D
Si vous avez déjà rencontré ce genre d’erreur et n’avez pas encore trouver de solution, ce post est faite pour vous. Nous allons dans les sections suivantes vous montrer comment on a pu résoudre cet erreur de programmation open GL.
[bctt tweet=”Opengl – undefined reference to gluOrtho2D” username=”tedidevblog”]
Opengl – undefined reference to gluOrtho2D – dépannage
La résolution de cet erreur consiste à ajouter l’option de compilation -lglu à la librairie d’opengl de votre projet. Nous utilisons l’IDE codeblock pour travailler donc en guise d’exemple d’application de la solution, on va montrer comment on a résolu le problème avec l’IDE.
Si vous utilisez comme moi l’IDE codeblock , il faudrait faire click droit sur le projet en cours, allez sur le chemin Build Options … > Linker Settings pour complèter la configuration en ajoutant dans les paramètres de linker. Voir l’image ci dessous :
Le problème venait du fait qu’ on a oublié d’intégrer une option Linker dans la configuration d’Open gl pour le projet en cours.
Il peut arriver que vous n’arrivez pas du tout à exécuter un projet opengl malgré que vous l’avez installer dans votre ordinateur. La solution est d’ ajouter au projet , le chemin vers la librairie opengl. Sous linux, on a ajouté le chemin /usr/local/lib/libglut.so pour pouvoir compiler notre projet opengl.
Si vous tout est bien configuré , essayez le code de la section suivante pour tester votre configuration.
Tester sa configuration opengl
Pour être sure que votre oonfiguration fonctionne comme on veut, j’ai concocté un code spécial pour vous. En réalité c’est juste le code qui m’a coincé avec l’erreur undefined reference to gluOrtho2D . Copiez et collez le code source suivant , avant même d’essayer de le comprendre. Ce n’est pas non plus un moteur de jeux donc ne vous emballez pas.
#ifndef OPENGL_WINDOWS_H_INCLUDED #define OPENGL_WINDOWS_H_INCLUDED #endif // OPENGL_WINDOWS_H_INCLUDED #include<GL/gl.h> #include<GL/glu.h> #include<X11/Xlib.h> #include<GL/glx.h> #include<GL/freeglut.h> #include<stdlib.h> #include<stdio.h> #define drawOneLine(x1,y1,x2,y2) glBegin(GL_LINES) ; \ glVertex2f((x1),(y1)) ; glVertex2f((x2),(y2)) ; glEnd(); void init(void) { glClearColor(0.0,0.0,0.0,0.0); glShadeModel(GL_FLAT); } void display(void) { int i; glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0,1.0,1.0); // in 1rst row , 3 lines, each with a different stipple glEnable(GL_LINE_STIPPLE); glLineStipple(1,0x0101); // dotted drawOneLine(50.0,125.0,150.0,125.0); glLineStipple(1,0x00FF); // dashed drawOneLine(150.0,125.0,250.0,125.0); glLineStipple(1,0x1C47); // dash / dot / dash drawOneLine(250.0,125.0,350.0,125.0); // in 2nd row , 3 wide lines, each with a different stipple glLineWidth(5.0); glLineStipple(1,0x0101); // dotted drawOneLine(50.0,100.0,150.0,100.0); glLineStipple(1,0x00FF); // dashed drawOneLine(150.0,100.0,250.0,100.0); glLineStipple(1,0x1C47); // dash / dot / dash drawOneLine(250.0,100.0,350.0,100.0); glLineWidth(1.0); // in 3rd row , 6 lines, with // dash / dot / dashstipple // as part of a single connected line strip glLineStipple(1,0x1C47); // dash / dot / dash glBegin(GL_LINE_STRIP); for(i = 0; i<7; i++) glVertex2f(50.0+((GLfloat) i*50.0), 75.0); glEnd(); // in 4th row, 6 independant lines with same stipple for (i = 0; i<6 ; i++) { drawOneLine(50.0 + ((GLfloat) i * 50.0),50.0, 50.0 + ((GLfloat)(i+1) * 50.0), 50.0); } // in 5th row, 1 line with dash / dot .dash stipple // and a stoipple repeat factor of 5 glLineStipple(5,0x1C47); // dash / dot / dash drawOneLine(50.0,25.0,350.0,25.0); glDisable(GL_LINE_STIPPLE); glFlush(); } void reshape(int w , int h) { glViewport(0,0,(GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0,(GLdouble) w, 0.0, (GLdouble) h); } int run(int argc, char** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400,150); glutInitWindowPosition(100,100); glutCreateWindow(argv[0]); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0; } int main(int argc, char** argv){ return run(argc,argv); }
C’est long je sais. Si le code ne génère aucune erreure, vous aurez réussit. Je n’afficherai pas le résultat pour ne pas vous spoiler.
Conclusion
Ce qu’il faut retenir de cette section, c’est que quand vous rencontrez l’erreur undefined reference to gluOrtho2D c’est que votre projet n’arrive pas à trouver la librairie opengl pour comprendre votre code. Votre réflexe serait de vérifier si votre projet est proprement configuré pour trouver opengl et ses librairies. Concrètement sur code::block , il faut :
- faire click droit sur le projet en court et allez sur le chemin Build Options … > Linker Settings
- Ajouter le linker -lglu
Au cas où votre premier projet ne s’est jamais compilé bien que vous ayez installer OpenGL dans votre système, il faut :
- Ajouter le chemin vers la librairie opengl que vous utilisez. ( sous linux c’est usr/local/lib/libglut.so )