C / Undefined reference ....... [Résolu/Fermé]

Wanted59 44 Messages postés vendredi 6 mars 2009Date d'inscription 15 octobre 2009 Dernière intervention - 8 oct. 2009 à 22:29 - Dernière réponse :  hapaahamza
- 13 août 2014 à 20:53
Bonjour,

Les "Undefinded reference" me hantent c'est horrible, ce coup si je ne pige encore une fois de plus pas du tout pourquoi ça bug :

Message du debuggueur : 

main.cpp   84   Undefined reference to 'jouer(SDL_Surface *ecran)'


main.cpp :

#include <stdlib.h>
#include <stdio.h>
#include <SDL.h>
#include <SDL_image.h>

#include "Constante.h"
#include "Jeu.h"


int main(int argc, char *argv[])
{
    SDL_Surface *ecran = NULL, *menu1 = NULL, *menu2 = NULL;
    SDL_Rect positionMenu;
    SDL_Event event;

    int continuer = 1, afficherMenu2 = 0;

    SDL_Init(SDL_INIT_VIDEO);

    //SDL_WM_SetIcon(IMG_Load("caisse.jpg"), NULL);
    ecran = SDL_SetVideoMode(1280, 1024, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN);
    SDL_WM_SetCaption("Kuru's fries", NULL);

    menu1 = SDL_LoadBMP("Data/Menu/menu1.bmp");
    menu2 = SDL_LoadBMP("Data/Menu/menu2.bmp");

    positionMenu.x = 0;
    positionMenu.y = 0;

    while (continuer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = 0;
                break;
            case SDL_KEYDOWN:
                switch(event.key.keysym.sym)
                {
                    case SDLK_ESCAPE:
                        continuer = 0;
                        break;
                }
                afficherMenu2 = 1;
                break;
        }

        if(afficherMenu2 == 1);
        {
            switch(event.type)
            {
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_KP1:
                          //  jouer(ecran);
                            break;
                    }
                    break;
            }
        }

        jouer(ecran);



        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
        if(afficherMenu2 == 0)
            SDL_BlitSurface(menu1, NULL, ecran, &positionMenu);
        if(afficherMenu2 == 1)
            SDL_BlitSurface(menu2, NULL, ecran, &positionMenu);
        SDL_Flip(ecran);
    }

    SDL_FreeSurface(menu1);
    SDL_FreeSurface(menu2);
    SDL_Quit();

    return EXIT_SUCCESS;
}


jeu.c :

void jouer(SDL_Surface *ecran)
{
    SDL_Surface *kurutchin[100] = {NULL}, *frite[10] = {NULL};
    SDL_Surface *kurutchinActuel = NULL, *fond = NULL;
    SDL_Rect positionKurutchin, positionFond;
    SDL_Event event;

    int continuer =  1;

    /* ... du code (juste des initialisations) ... */

    while (continuer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = 0;
                break;
            case SDL_KEYDOWN:
                switch(event.key.keysym.sym)
                {
                    case SDLK_ESCAPE:
                        continuer = 0;
                        break;
                }
                break;
        }


        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
        SDL_BlitSurface(fond, NULL, ecran, &positionFond);


    }
}


jeu.h :

#ifndef JEU_H_INCLUDED
#define JEU_H_INCLUDED


void jouer(SDL_Surface *ecran);



#endif // JEU_H_INCLUDED




J'ai coché Debug et release sur tout mes fichiers, et le débuggueur ne voit pas d'erreur mise a part ce fichu "undefined reference"

Vous êtes mes seuls espoirs svp ^^

Merci d'avance
Afficher la suite 

13 réponses

+2
Utile
1
Salut,
En fait loupius, a raison, mais il le dit mal. Tu doit linker le fichier libSDL.a(ou quelque chose de semblable) à ton projet, afin que le compilo prenne des informations sur les fonction que tu veut utiliser,si tu utilse CodeBlocks, va dans Projects/Build Target/Linker Settings/Add/.../"Chemin de ton fichier.a(ou '.lib')".
Mais je ne pense pas que ton problème soit dû à cela, c'est juste que ton fichier 'main.c' ne connaisse pas l'implémentation de la fonction jouer(d'ou l'erreur"Undefined reference to 'jouer(SDL_Surface *ecran)'
"). Tu rajoute donc à ton main.cpp

#include "jouer.h"
#include "jouer.c"

Et comme par ... le tout fonctionne(j'espère quand même ne pas avoir dit trop de bêtises).

@+
Cette réponse vous a-t-elle aidé ?  
bordel merci
j'avais inclus le .h mais pas le .c
+1
Utile
C'est bien ce qui me semblait, ça a rien à voir avec le débogueur; c'est simplement une erreur de déclaration. En effet, la compilation réclame des informations nécessaires à la construction de l'exécutable, notamment les bibliothèques utilisées. Donc tu dois déclarer l'utilisation de 'SDL'.
Bonne continuation.
+1
Utile
Et bien tu dois dire que l'édition des liens doit se faire avec la bibliothèque 'SDL'.
Pour cela, avec QtCreator, édite le fichier ???.pro et ajoute une ligne du style:
LIBS += -lSDL
Ensuite tu reconstruis le tout avec la commande Build/Rebuild All. Je pense que ça devrait aller.
Bonne continuation.
0
Utile
Il y a quelque chose qui me gêne; pour moi ce n'est pas le débogueur qui donne ce message; il est généré lors de la compilation.
Peut-on avoir tous les messages de la compilation (à moins qu'il y ait plus de 20 lignes) et quelle est exactement la ligne 84 de main.cpp ?
Wanted59 44 Messages postés vendredi 6 mars 2009Date d'inscription 15 octobre 2009 Dernière intervention - 9 oct. 2009 à 19:13
0
Utile
Salut, merci de me préter interet :)

Alors à la ligne 84 du main .cpp il y a :     jouer(ecran);

Message entier du débuggueur :


                     ||=== Kuru's fries, Debug ===|
             obj\Debug\main.o||In function `SDL_main':|
  Kuru's fries\main.cpp|84|undefined reference to `jouer(SDL_Surface*)'|
            ||=== Build finished: 1 errors, 0 warnings ===|

Voilà voilà.
chuka 969 Messages postés samedi 11 octobre 2008Date d'inscription 29 juillet 2010 Dernière intervention - 9 oct. 2009 à 19:48
0
Utile
dsl j'ai posté n'importe quoi avant.....
Wanted59 44 Messages postés vendredi 6 mars 2009Date d'inscription 15 octobre 2009 Dernière intervention - 10 oct. 2009 à 14:52
0
Utile
Merci pour le conseil, mais euh ... c'et quoi déclarer l'utilisation de 'SDL'?
Wanted59 44 Messages postés vendredi 6 mars 2009Date d'inscription 15 octobre 2009 Dernière intervention - 11 oct. 2009 à 10:32
0
Utile
Je comprend pas trop enfaite, car j'ai jamais utilisé qt creator.
Il faut que je créé un fichier du genre editSDL.pro et que j'ajoute une ligne
LIBS += -1SDL mais je l'ajoute où cette ligne?
Pi ensuite je reconstruit quoi? car je comprends pas comment faire du tout là.
Merci de m'expliquer stp pi encore merci de m'avoir répondu :).
0
Utile
Oh, je te prie de m'excuser, j'ai fait une erreur entre deux posts et je croyais que tu utilisais QtCreator.
Donc je suppose que tu utilises la ligne de commande, quelque chose du genre:
gcc -Wall -c main.cpp jeu.c -o jeu
alors modifie ta ligne ainsi:
gcc -Wall -c main.cpp jeu.c -lSDL -o jeu
D'ailleurs, comment se fait-il qu'il y ait un fichier 'c' et un fichier 'cpp' ? Ce n'est pas très cohérent !
Mille excuses pour cette perte de temps.
Wanted59 44 Messages postés vendredi 6 mars 2009Date d'inscription 15 octobre 2009 Dernière intervention - 15 oct. 2009 à 18:59
0
Utile
Ba euh j'utilise aucune ligne de commande, d'ailleur je sais pas de quoi tu me parle là, dsl.
0
Utile
J'ai exactement le meme probleme ( je suis le tuto C sur le site du zero)
Je ne trouve aucune solution j'ai bien mit les #include "jeu.h" et editeur.h mais sa ne marche pas.
J'ai bien mit tout mes fichier dans le projet etc etc

aidez moi
Drave
hapaahamza - 13 août 2014 à 20:53
0
Utile
Salut,

tout ce que vous avez dit ne m'a pas été utile, et je pense c'est ce que ça va être pour quelqun, alors ce que m'a aidé est la suite

vous devez aller au dossier de votre projet et supprimer tout fichier nouveau, ça veut que vous n'avez pas crée, et je précise les dossiers bin et obj, et un fichier que son nom contient depend ou qqch comme ca

j'espere que ca va aider