OpenGL avec Eclipse CDT + MinGW + GLEW + GLFW: Références non définies

Edit: J’ai entre-temps compris cela et écrit une réponse détaillée ci-dessous.

J’ai juste essayé de passer de la version Express de MSVC 10 à Eclipse CDT sous Win7, et lors de la configuration, j’ai rencontré un problème avec le code OpenGL simple suivant (qui fonctionne correctement dans Visual Studio):

#define GLEW_STATIC #include  #include  int main() { GLFWwindow* w; if (!glfwInit()) return -1; w = glfwCreateWindow(640, 480, "Hello World", NULL, NULL); if (!w) { glfwTerminate(); return -1; } glfwMakeContextCurrent(w); glewExperimental = true; if (glewInit() != GLEW_OK) { return -1; } while (!glfwWindowShouldClose(w)) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glfwSwapBuffers(w); glfwPollEvents(); } glfwTerminate(); return 0; } 

Dans Visual Studio, j’inclus les chemins d’access aux bibliothèques pour GLFW et GLEW, ainsi que les liens (en plus des éléments intégrés par VS): opengl32.lib, glew32s.lib, glfw3.lib, dans cet ordre.

Maintenant, si je fais la même chose dans Eclipse CDT, je ne peux pas le faire fonctionner. Les erreurs suivantes se produisent:

 Info: Internal Builder is used for build g++ "-LD:\\lib\\cpp\\glfw-3.0.1.bin.WIN32\\lib-mingw" "-LD:\\lib\\cpp\\glew-1.10.0binaries\\lib\\Release\\Win32" -o glfwcheck.exe main.o -lopengl32 -lglew32s -lglfw3 Warning: .drectve `/DEFAULTLIB:"LIBCMT" /DEFAULTLIB:"OLDNAMES" ' unrecognized D:\lib\cpp\glew-1.10.0binaries\lib\Release\Win32/glew32s.lib(tmp/glew_static/Release/Win32/glew.obj):(.text[__glewInit_GL_VERSION_1_2]+0x4): undefined reference to `_imp__wglGetProcAddress@4' D:\lib\cpp\glew-1.10.0binaries\lib\Release\Win32/glew32s.lib(tmp/glew_static/Release/Win32/glew.obj):(.text[__glewInit_GL_VERSION_1_3]+0x4): undefined reference to `_imp__wglGetProcAddress@4' d:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: D:\lib\cpp\glew-1.10.0binaries\lib\Release\Win32/glew32s.lib(tmp/glew_static/Release/Win32/glew.obj): bad reloc address 0x4 in section `.text[__glewInit_GL_VERSION_1_3]' d:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation collect2.exe: error: ld returned 1 exit status 

Bien sûr, j’ai essayé de changer l’ordre des trois bibliothèques, mais ça n’a fait qu’aggraver les choses. (Au fait: je pense que c’est étrange que je ne puisse pas reproduire ces erreurs ci-dessus, de sorte qu’elles sont les seules lorsque je réorganise les bibliothèques dans l’ordre initial. Je rest à plus de 20 erreurs jusqu’à ce que je supprime TOUTES les bibliothèques. , construisez et ajoutez-les encore.)

Après avoir tâtonné et parcouru les messages du forum, je me suis dit que c’était peut-être un problème avec les fichiers binarys GLEW et les ai compilés moi-même avec MinGW. Seulement cette fois, j’obtiens toutes les erreurs ‘not found’. Je ne sais pas comment je peux relier statiquement mon GLEW auto-compilé, puisqu’il n’y a plus de glew32s.lib à présent, mais seulement libglew32.a et libglew32mx.a. Lier dynamicment avec glew32 et mettre la dll dans mon dossier de projet ne fonctionnait pas non plus.

Je sens que je fais quelque chose de très mauvais ici dans Eclipse, ou que j’oublie simplement quelques bibliothèques supplémentaires (bien que j’aie essayé une fois de mettre toutes celles que VS utilise là aussi et que cela ait toujours fait exactement la même chose).

Peux-tu m’aider? 🙂 Sinon, je pense que je devrais restr avec VS ou passer à Linux + make.

Je l’ai compris, et pour tous ceux qui rencontrent le problème, je vais essayer de préciser ce que j’ai fait pour pouvoir enfin créer des projets OpenGL avec la configuration MinGW + GLEW + GLFW . Dans mon cas, j’ai utilisé Eclipse CDT comme IDE, mais j’écrirai la ligne de commande résultante g++ afin de faciliter l’adaptation à d’autres IDE.

  1. Je suppose que MinGW et MSYS (peuvent être choisis pour être installés à partir de l’interface graphique de MinGW; il n’est donc pas nécessaire de télécharger séparément) sont installés.

  2. Téléchargez GLFW et décompressez-le dans le dossier de votre choix pour les bibliothèques externes (dans mon cas, il s’agit de D:\external\cpp , ce serait donc quelque chose du D:\external\cpp\glfw , où j’ai renommé glfw-3.0.3.bin.WIN32 Dossier glfw-3.0.3.bin.WIN32 pour simplement glfw ).

  3. Téléchargez la source GLEW sous forme de dossier zip et décompressez-la. Dans mon cas, elle se trouve dans D:\external\cpp\glew . Maintenant, démarrez MSYS , glew dossier glew et glew make all .

  4. L’étape 3 aurait dû créer (entre autres) les fichiers libglew32.a et glew32.dll dans le dossier glew\lib . Maintenant, faites un clic droit sur votre projet Eclipse CDT C ++, allez à Propriétés – C / C ++ Général – Chemins et symboles . Dans l’onglet Inclut , ajoutez les chemins d’access aux dossiers d’ include de GLFW et GLEW. Encore une fois, pour moi, c’est D:\external\cpp\glew\include et analogue pour GLFW. Dans Library Paths , procédez de la même manière pour les dossiers lib (GLEW) et lib-mingw (GLFW).

  5. Nous devons maintenant append les bibliothèques avec lesquelles nous souhaitons relier notre projet. Si vous souhaitez créer un lien dynamic avec GLEW, veillez à inclure le glew32.dll dans le dossier glew32.dll votre exécutable. Dans Eclipse CDT, il s’agit généralement du dossier Debug (ou Release ) de la structure de votre projet. Dans l’onglet Bibliothèques de la fenêtre d’options déjà ouverte, ajoutez (l’ordre est important!) glfw3 , glew32 , opengl32 , glu32 , gdi32 . Maintenant, la construction du projet devrait fonctionner avec espoir. Si vous souhaitez établir une liaison statique avec GLEW, ajoutez les mêmes bibliothèques à l’exception de glew32 . Au lieu de cela, dans les propriétés du projet, accédez à C / C ++ Construction – Paramètres et dans l’onglet Paramètres de l’ outil – libglew32.a de libglew32.a C ++ de MinGW, ajoutez le chemin d’access à libglew32.a dans le champ Autres objects . Dans mon cas, c’est D:\external\cpp\glew\lib\libglew32.a . Maintenant, pour que la liaison statique fonctionne, vous devez append #define GLEW_STATIC au-dessus de #include ou utiliser la commande de préprocesseur -DGLEW_STATIC . La page d’accueil GLEW indique qu’il est également possible d’inclure les fichiers glew.c et glew.h dans votre projet afin de glew.h un lien statique, mais que cela n’a pas vraiment fonctionné pour moi.

Ces étapes ont fonctionné pour moi et elles ont généré des lignes de commande similaires à celles-ci (je n’ai qu’un seul fichier nommé main.cpp et utilisé une liaison statique avec GLEW), ce qui pourrait être utile si vous essayez de résoudre ce problème sans Eclipse CDT. .

 g++ -ID:\external\cpp\glew\include -ID:\external\cpp\glfw\include -c -o main.o main.cpp g++ -LD:\external\cpp\glew\lib -LD:\external\cpp\glfw\lib-mingw -o minimalexample.exe main.o D:\external\cpp\glew\lib\libglew32.a -lglfw3 -lopengl32 -lglu32 -lgdi32 

Dans le cas de la liaison dynamic, supprimez simplement la partie contenant libglew32.a dans la deuxième ligne et ajoutez -lglew32 entre -lglfw3 et -lopengl32 . Comme petit exemple de fichier source, vous pouvez simplement utiliser le code de la question ci-dessus.

J’espère que je peux aider n’importe qui avec ça, car j’ai bien vu que j’avais beaucoup de difficulté à comprendre cela entre des dizaines de messages d’erreur de symboles non résolus et divers autres problèmes 🙂

Mise à jour: j’ai essayé de revenir sur cette question il ya quelques jours et j’ai eu des problèmes avec les fichiers binarys GLFW précompilés pour Windows (je suis maintenant sous Win8.1). Mais vous pouvez simplement utiliser CMake en combinaison avec mingw32-make pour le comstackr vous-même. De plus, GLEW ne semble plus recevoir de mises à jour, aussi je suis passé à content . Il est également possible d’utiliser MinGW-w64 pour comstackr les bibliothèques et votre projet final en tant qu’application 64 bits.