Problème avec textures

Signaler
Messages postés
29
Date d'inscription
samedi 11 mars 2006
Statut
Membre
Dernière intervention
13 décembre 2011
-
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
Salut à tous!

Je vous explique mon problème, j'essaie (en vain) d'appliquer des textures en OpenGL avec DevCpp à l'aide du site du zéro.
Problème, je lance mon programme, qui fonctionne, j'ajoute l'include sdlglutils.h comme indiqué sur le site. Et je déclare GLuint identifiant_texture = loadTexture("ROCK.bmp"), par la suite.

Et là ça coince!   Erreurs : [Linker error] undefined reference to `loadTexture(char const*, bool)'
                                        [Linker error] undefined reference to `WinMain@16'

Qu'est ce que je peux faire? Est ce que je n'ai pas les bons Linker?

Merci à tous

27 réponses

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Salut,

Erreurs : [Linker error] undefined reference to `loadTexture(char const*, bool)'

Il doit te manquer une librairie en entrée du lieur. Quelque part dans les options du projet sous dev-cpp, il doit y avoir un endroit où tu peux ajouter des libs. La librairie manquante doit être associée à sdlglutils, donc tu l'as probablement téléchargée au même moment, elle a un nom similaire ou je sais pas quoi...

Linker error] undefined reference to `WinMain@16'

Ca, c'est que le linker a un souci avec le point d'entrée de ton programme. Tu as un "main" ? Si oui, c'est que ton appli est une application fenêtrée. il te faut alors définir un WinMain en lieu et place du main, comme ça.
Messages postés
29
Date d'inscription
samedi 11 mars 2006
Statut
Membre
Dernière intervention
13 décembre 2011

Merci beaucoup! Je venais juste de trouver! Mais au moins, j'ai compris à quoi correspond 'WinMain@16'

En fait, maintenant, je suis confronté à un autre problème, j'ai ajouté des bibliothèque etc..., donc SDL_image,

Et lorsque je compile, j'ai des nouvelles erreurs de linkage,
  [Linker error] undefined reference to `SDL_ConvertSurface'
  [Linker error] undefined reference to `SDL_FreeSurface'
  [Linker error] undefined reference to `SDL_CreateRGBSurface'
  [Linker error] undefined reference to `SDL_LockSurface'
  [Linker error] undefined reference to `SDL_UnlockSurface'
  [Linker error] undefined reference to `SDL_RWFromFile'
  [Linker error] undefined reference to `SDL_SaveBMP_RW'
  [Linker error] undefined reference to `SDL_GetVideoInfo'  etc....

Donc maintenant, c'est la galère! Je pense que c'est encore une histoire de librairies, mais je ne sais pas laquelle!
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
D'après eux c'est la librairie SDL, tout simplement.
Il demande d'utiliser -lSDL -> option -l pou lier avec la librairie SDL.
Messages postés
29
Date d'inscription
samedi 11 mars 2006
Statut
Membre
Dernière intervention
13 décembre 2011

Merci!

Maintenant, voilà le retour de du vilain :   [Linker error] undefined reference to `WinMain@16'

J'ai essayé avec ton précédent lien, et je ne suis pas sûr de bien comprendre, il faut que je remplace mon main par ce WinMain?
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Oui.
Messages postés
29
Date d'inscription
samedi 11 mars 2006
Statut
Membre
Dernière intervention
13 décembre 2011

Hi!

J'ai un gros problème avec ce WinMain, je n'arrive pas  à réinitialiser tout ce que faisait mon main d'origine, et de plus, même avec windows.h, il ne connait pas toutes les fonctions du liens que tu m'as donné.
J'ai enlevé pas mal de chose de mon main, pour le poster, qql pourrait il me dire les modifications à apporter pour que ça passe dans le WinMain svp?!

int
main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("Texture Test");

    glutReshapeFunc(resize);
    glutDisplayFunc(display);
    glutKeyboardFunc(key);
    glutIdleFunc(idle);

    glClearColor(1,1,1,1);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    glutMainLoop();

    return EXIT_SUCCESS;
}

Si déjà je pouvais faire fonctionner ça, se serait cool!
//Dsl pour ce post pourri de code, mais je savais pas comment le faire de façon classe
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Erf.. On dirait que glutInit attend vraiment un main.

A ta place je compilerai en mode application console. Tu auras une console qui sert à rien ou pas grand chose, mais ça te permettra au moins d'avancer.
Messages postés
29
Date d'inscription
samedi 11 mars 2006
Statut
Membre
Dernière intervention
13 décembre 2011

Je ne sais pas si j'ai fais ce que tu m'a conseillé, mais j'ai crée une nouvelle appli console sous, Dev, j'ai rajouter mes lib de link, ect... Et au final, j'ai toujours la même erreur,   [Linker error] undefined reference to `WinMain@16'

Est ce que ça pourrait venir de mauvaises librairies de link?
Voilà avec quoi il fait le linkage:

-lglut32 -lglu32 -lopengl32 -lwinmm -lgdi32
C:/Dev-Cpp/lib/libSDLmain.a
C:/Dev-Cpp/lib/libopengl32.a
C:/Dev-Cpp/lib/libglu32.a
C:/Dev-Cpp/lib/libglut32.a
C:/Dev-Cpp/lib/libwin32k.a
C:/Dev-Cpp/lib/libwin32spl.a
C:/Dev-Cpp/lib/libmingw32.a
C:/Dev-Cpp/lib/libSDL_Image.a
C:/Dev-Cpp/lib/libdxguid.a
C:/Dev-Cpp/lib/libuser32.a
C:/Dev-Cpp/lib/libSDL.dll.a
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Nan ça à l'air bien.
Je te conseille de passer à Code::Blocks, libre aussi, mais qui continue d'évoluer.
Dev-Cpp, me souviens plus comment switcher console/windows.

Essaie de mettre _CONSOLE dans les définitions de préprocesseur, et vire un éventuel _WINDOWS déjà en place.
Messages postés
29
Date d'inscription
samedi 11 mars 2006
Statut
Membre
Dernière intervention
13 décembre 2011

J'ai pas le choix, je peux utiliser que DevCpp ici!
J'ai tenté le #define _CONSOLE sur mon main.cpp, et toujours pareil....
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Déprimant ton histoire.

Il faut vraiment le définir tôt... Pas dans le code. Et je suis même pas sûr que ça suffise.

Autre solution...
Fait un include de windows.h.

Remplace ton main par un WinMain.
Passe des arguments vides à gluInit :

  int argc;
  char** argv;

  argc = 0;
  argv = NULL;
  glutInit(&argc, argv);

Tu pourrais aussi construire argc et argv plus proprement à partir du lpCommandLine de WinMain.
Messages postés
29
Date d'inscription
samedi 11 mars 2006
Statut
Membre
Dernière intervention
13 décembre 2011

ahhh! Petite avancée! Mon prog passe le linkage en passant des arguments vides, mais autre soucis,
il me dis que SDL_image.dll est introuvable, et il plante...

Je me suis peut être (même surement) trompé, je l'ai ajouté au linkage. Où est ce que je dois l'ajouter?

Je suis d'accord c'est vraiment déprimant, à coté je crée une application qui génère des textures à partir de bases de données, ça marche mieux!
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Pour utiliser une .dll, il faut inclure un .h pour la compilation, mettre un .lib en entrée du lieur pour le link, et finalement, pour l'exécution mettre la dll dans, au choix :
Le répertoire du .exe.
Le répertoire courant.
Un répertoire dans la variable PATH.
...

Il faudra que tu fournisse la dll avec ton .exe si tu distribue ton appli.
Messages postés
29
Date d'inscription
samedi 11 mars 2006
Statut
Membre
Dernière intervention
13 décembre 2011

J'ai essayé de rajouter les dll à mon projet. Dès qu'il plantait, il me disait que ça venait de xxxx.dll, donc je les ai toutes rajoutées.
Mais maintenant, à l'execution du programme, il plante directement.... Là je ne vois pas du tout de quoi ça peut venir...
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Message d'erreur ?

"directement" -> si tu mets un printf (Ou une MessageBox si tu n'as pas de console) au début du main, tu le vois ou pas ?

Tu as essayer de déboguer (Points d'arrêt, pas à pas...) Plus d'explications ici par exemple, à la fin.
Messages postés
29
Date d'inscription
samedi 11 mars 2006
Statut
Membre
Dernière intervention
13 décembre 2011

J'ai essayé le débogage, il plante dès le début!

J'envisage peut être de laisser cette méthode.
Est ce que tu aurais une autre façon d'appliquer les textures? Parce que tout ça c'est depuis que j'ai essayé d'en appliquer, avant aucuns soucis. Et comme je vais implanter mon programme après sous Builder, je voudrai trouver un truc assez simple!
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Ca veut dire quoi "appliquer les textures", ou plutôt, sur quoi applique tu tes textures ?
Messages postés
29
Date d'inscription
samedi 11 mars 2006
Statut
Membre
Dernière intervention
13 décembre 2011

Je veux dire appeler un fichier .bmp ou .jpg pour le "coller" à une sphère par exemple ou à un cube pour lui donner un autre aspect qu'une couleur. Comme un quadrilatère sur lequel on applique une certaine texture pour lui faire ressembler à un mur.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Dans ce cas tu es "obligé" de passer par une librairie comme tu l'as fait, que ce soit en utilisant OpenGL ou DirectX.

Mais je suis pas sûr qu'il soit plus facile de se mettre à DirectX que de se mettre à OpenGL (Surtout avec Dev-Cpp...)

Tu as essayé la MessageBox ?

int
main(int argc, char *argv[])
{
    MessageBox(NULL, "Kikoo", "lol", MB_OK);
    glutInit(...);

Avec une include de windows.h.
Pour savoir si le problème se fait avant l'entrée du main.

C++ Builder est aussi un vieux produit (Je suppose que tu as une version 6) mais à côté de Dev-Cpp, il est quand même plus à l'aise pour le débogage. De plus tu dois pouvoir trouver des composants pour t'aider.

Tuto OpenGL pour C++ Builder ici.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Par exemple, pour de la 3D pour les nuls, tu as GLScene que tu peux installer sous Builder.