CommentCaMarche
Recherche
Posez votre question Signaler

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

Wanted59 44Messages postés vendredi 6 mars 2009Date d'inscription 15 octobre 2009Dernière intervention - Dernière réponse le 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
Lire la suite 
Réponse
+2
moins plus
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).

@+
anonyme- 17 janv. 2013 à 16:43
bordel merci
j'avais inclus le .h mais pas le .c
Répondre
Ajouter un commentaire
Réponse
+1
moins plus
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.
Ajouter un commentaire
Réponse
+1
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
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 ?
Ajouter un commentaire
Réponse
+0
moins plus
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à.
Ajouter un commentaire
Réponse
+0
moins plus
dsl j'ai posté n'importe quoi avant.....
Ajouter un commentaire
Réponse
+0
moins plus
Merci pour le conseil, mais euh ... c'et quoi déclarer l'utilisation de 'SDL'?
Ajouter un commentaire
Réponse
+0
moins plus
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 :).
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
Ba euh j'utilise aucune ligne de commande, d'ailleur je sais pas de quoi tu me parle là, dsl.
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Ce document intitulé «  C / Undefined reference .......  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.