IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

probleme d'include : undefined reference to 'x'


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 2
    Par défaut probleme d'include : undefined reference to 'x'
    Bonjour,


    avec mon code en plusieurs partie

    laby.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
     
    #include <stdio.h>
    #include <stdlib.h>
    #ifndef GRAPHICS
    #define GRAPHICS
    #include "graphics.h"
    #endif
    #include <math.h>
     
     
    #define true 1
    #define false 0
    #define mur 1
    #define nbCases 481//Nombre de cases
    #define hauteur 700//Hauteur du terrain
    #define largeur 700//Largeur du terrain
    #define COULEUR_TERRAIN gris//Couleur des murs
    #define COULEUR_PERSO 0xff0088//Couleur du personnage
    #define haut (int)(sqrt(nbCases)) // nb de cases verticales
    #define large (int)(sqrt(nbCases)) // nb de cases horizontales
    #define ecartCase_x ((largeur)/(large))//ecart entre deux cases horizontales
    #define ecartCase_y ((hauteur)/(haut))//ecart entre deux cases horizontales
    #define rayon ((ecartCase_x)/2)-2//rayon d'un monstre, personnage et bonus
    #define W ((haut)*(ecartCase_x))//du a qulques problemes d'affichage(equivalant de largeur)
    #define H ((large)*(ecartCase_y))//du a qulques problemes d'affichage(equivalant de hauteur)
    #define iteration (haut)*(large)-2//Nombre d'iterations lors de la creation du labyrinthe aleatoire
    #define casesMoinsUnX (W-ecartCase_x)// position de la case moins 1 en x
    #define casesMoinsUnY (H-ecartCase_y)// position de la case moins 1 en y
    #define N 100
     
    typedef struct Cases{
     
    	int mg;
    	int md;
    	int mh;
    	int mb;
    	POINT curseur1;//bas gauche de la case
    	POINT curseur2;//haut droite de la case
    	int inChemin;
    }Cases;
     
     
    typedef struct Perso
    {
    	POINT pos;
    }Perso;
     
    typedef struct Monstre
    {
    	POINT pos;
    }Monstre;
     
    typedef struct Bonus
    {
    	POINT pos;
    	int trouve;
    }Bonus;
     
    typedef struct{
      int  Positionx[N];
      int  Positiony[N];
      int taille;
    } *PILE;
     
    //Initialise une pile
    extern PILE init_vide(PILE p);
     
     
    //Ajoute un personnage a une pile
    extern PILE ajoute_Perso(PILE p,Perso per);
     
     
    //Supprime un personnage de la pile
    extern PILE supprime_Perso(PILE p);
     
     
    //ajoute un personnage a la pile
    extern PILE ajoute_Monstre(PILE p,Monstre m);
     
    //Supprime un monstre de la pile
    extern PILE supprime_Monstre(PILE p);
     
     
    //Initialise les valeurs des murs des labyrinthe 
    //Trace un quadrillage
    extern void initLab(Cases lab[nbCases][nbCases]);
     
     
    //Dessine les entrees et sorties du labyrinthe
    extern void traceE_S();
     
     
    //Affiches les cases du labyrinthe en fonction des cases
    extern void afficheCase(Cases lab[nbCases][nbCases]);
     
     
    //Charge les valeurs du labyrinthe et les affichent
    extern void trace_vide(Cases lab[nbCases][nbCases]);
     
     
    //Trace un labyrinthe aleatoire
    extern void aleatoire(Cases lab[nbCases][nbCases]);
     
     
    //Initialise un personnage
    extern Perso initPerso(Perso p, Cases lab[nbCases][nbCases]);
     
     
    //Efface un personnage
    extern void effacePerso(Perso p);
     
     
    //Affiche un personnage
    extern void affichePerso(Perso p);
     
    //Deplace un personnage
    extern Perso deplacePerso(Perso per, Cases lab[nbCases][nbCases], char key, PILE pi, POINT p);
     
     
    //Affiche un monstre
    extern void afficheMonstre(Monstre m);
     
     
    //Efface un monstre
    extern void effaceMonstre(Monstre m);
     
     
    //Initialise un monstre aleatoirement sur le labyrinthe
    extern Monstre initMonstre(Monstre m, Cases lab[nbCases][nbCases]);
     
     
    //Fonstion d'affichage compte-a-rebours
    extern void attDebut();
     
     
    //Affiche les regles du jeu
    extern void afficheRegles();
     
     
    //Affiche un message de fin de partie
    extern void afficheFin();
     
    //Affiche un message de victoire
    extern void Victoire();
     
     
    //Verifie s'il y a contacte entre le personnage et le monstre
    extern void Perdu(Perso per, Monstre m, PILE pi);
     
     
    //Deplace un monstre sur le labyrinthe et verifie l'appui de la touche n pour les retours en arriere
    extern Monstre deplaceMonstre(Monstre m, Cases lab[nbCases][nbCases], Perso per, char key, PILE pi, POINT p);
     
     
    //Initialise un bonus aleatoirement sur le labyrinthe
    extern Bonus initBonus(Bonus b, Cases lab[nbCases][nbCases]);
     
     
    //Affiche un bonus sur le labyrinthe
    extern void afficheBonus(Bonus b);
     
     
    //Efface le bonus du labyrinthe
    extern void effaceBonus(Bonus b);
     
     
    //Verifie le contacte entre le bonus et le personnage
    //ainsi que l'appui de la touche pour declencher le bonus
    extern Bonus recupBonus(Perso per, Bonus b, char key, POINT p, Cases lab [nbCases][nbCases]);

    sauvegarde.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    #include <stdio.h>
    #include <stdlib.h>
    #ifndef LABY
    #define LABY
    #include "laby.h"
    #endif
     
    //Sauvegarde la position des murs sur un fichier externe
    extern void sauvegardeMur(Cases lab[nbCases][nbCases]);
     
     
    //Sauvegarde la position du personnage sur un fichier externe
    extern void sauvegardePerso(Perso per);
     
    //Sauvegarde la position d'un monstre sur un fichier externe
    extern void sauvegardeMonstre1(Monstre m1);
     
    //Sauvegarde la position d'un monstre sur un fichier externe
    extern void sauvegardeMonstre2(Monstre m2);
     
    //Sauvegarde la position d'un monstre sur un fichier externe
    extern void sauvegardeMonstre3(Monstre m3);
     
    //Sauvegarde la position d'un monstre sur un fichier externe
    extern void sauvegardeMonstre4(Monstre m4);
     
    //Charge la position du personnage depuis un fichier externe
    extern Perso ChargerPerso(Perso per);
     
     
    //Charge la position d'un monstre depuis un fichier externe
    extern Monstre ChargerMonstre1(Monstre m1);
     
    //Charge la position d'un monstre depuis un fichier externe
    extern Monstre ChargerMonstre2(Monstre m2);
     
    //Charge la position d'un monstre depuis un fichier externe
    extern Monstre ChargerMonstre3(Monstre m3);
     
    //Charge la position d'un monstre depuis un fichier externe
    extern Monstre ChargerMonstre4(Monstre m4);
    labyrinthe.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "labyrinthe.h"
    //#include "graphics.h"
    //#include "laby.h"
    #include "sauvegarde.h"
    #ifndef LABY
    #define LABY
    #include "laby.h"
    #endif
    /*#ifndef GRAPHICS
    #define GRAPHICS
    #include "graphics.h"
    #endif*/
    #include <math.h>
    //#include "laby.h"
    //Execute le jeu
    int main(int argc, const char* argv[])
    {
    	affiche_auto_off();
    	init_graphics(W+1, H+1);
     
    	Perso per;
    	PILE p = 0; p = init_vide(p);
    	PILE pi = NULL; pi = init_vide(pi);
    	PILE pa = NULL; pa = init_vide(pa);
    	PILE pb = NULL; pb = init_vide(pb);
    	PILE pc = NULL; pc = init_vide(pc);
    	PILE pd = NULL; pd = init_vide(pd);
    	PILE pe = NULL; pe = init_vide(pe);
    	Monstre m1, m2, m3, m4;
    	Cases lab[nbCases][nbCases];
    	char key;
    	POINT P;
    	Bonus b;
    	fill_screen(black);
    	POINT p0, p1, p2, p4;
    	p0.x = largeur/15;
    	p0.y = hauteur - (hauteur/10);
    	p1.x=largeur/20;
    	p2.x=(largeur/2);
    	p4.x=p0.x + largeur/4;
    	p4.y = hauteur - (hauteur/5);
    	p1.y =hauteur/2;
    	p2.y =hauteur/2;
    	int taille = largeur/20;
    	int taille_choix = largeur/5;
    	afficheRegles();
    	aff_pol("Voulez-vous charger votre partie", taille , p0, red);
    	aff_pol("precedente?", taille , p4, red);
    	aff_pol("OUI", taille_choix, p1, red); 
    	aff_pol("NON", taille_choix, p2, red); 
    	FILE* F;
    	POINT pu = wait_clic();
    	fill_screen(black);
    	if(pu.x <(largeur/2))
    	{	
    		attDebut();
    		initLab(lab);
    		trace_vide(lab);
    		sauvegardeMur(lab);
    		per = ChargerPerso(per);
    		m1=ChargerMonstre1(m1);
    		m2=ChargerMonstre2(m2);
    		m3=ChargerMonstre3(m3);
    		m4=ChargerMonstre4(m4);
    	}
    	else if(pu.x >= (largeur/2))
    	{	
    		attDebut();
    		initLab(lab);
    		aleatoire(lab);
    		sauvegardeMur(lab);
    		per = initPerso(per, lab);
    		m1=initMonstre(m1, lab);
    		m2=initMonstre(m2, lab); 
    		m3=initMonstre(m3, lab); 
    		m4=initMonstre(m4, lab); 	
    	}
    		b = initBonus(b, lab);
    		afficheBonus(b);
    		affichePerso(per);
    		afficheMonstre(m1);
    		afficheMonstre(m2);
    		afficheMonstre(m3);
    		afficheMonstre(m4);
     
    	while(1)
    	{
    		P = wait_key(&key);
    		per=deplacePerso(per, lab, key, p, P);
    		m1=deplaceMonstre(m1, lab, per, key, pi, P);
    		m2=deplaceMonstre(m2, lab, per, key, pa, P);
    		m3=deplaceMonstre(m3, lab, per, key, pb, P);
    		m4=deplaceMonstre(m4, lab, per, key, pc, P);
    		sauvegardePerso(per);
    		sauvegardeMonstre1(m1);
    		sauvegardeMonstre2(m2);
    		sauvegardeMonstre3(m3);
    		sauvegardeMonstre4(m4);
    		b = recupBonus(per, b, key, P, lab);
    	}
     
    	affiche_auto_on();
    	wait_escape();
    	exit(0);
    }
    labyrinthe.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include <stdio.h>
    #include <stdlib.h>
     
    //Execute le jeu
    int main(int argc, const char* argv[]);
    avec le MAKEFILE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    CC=gcc
    CFLAGS=-O2 -Wall `sdl-config --cflags`
    LIBS=`sdl-config --libs` -lm -lSDL_ttf
     
    #Cible generique pour Linux
    %: graphics.o %.c
    	rm -f $@
    	$(CC) $(CFLAGS) graphics.o $@.c -o $@ $(LIBS)
     
    graphics.o: graphics.c graphics.h
    	rm -f police.h
    	touch police.h
    	if test -e /usr/include/SDL_ttf.h;           then echo "#define SDL_TTF_OK" > police.h; fi
    	if test -e /usr/include/SDL/SDL_ttf.h;       then echo "#define SDL_TTF_OK" > police.h; fi
    	if test -e /usr/local/include/SDL_ttf.h;     then echo "#define SDL_TTF_OK" > police.h; fi
    	if test -e /usr/local/include/SDL/SDL_ttf.h; then echo "#define SDL_TTF_OK" > police.h; fi
    	$(CC) $(CFLAGS) -c graphics.c 
     
    sauvegarde.o : sauvegarde.c sauvegarde.h graphics.h 
    	$(CC) $(CFLAGS) graphics.o sauvegarde.c -o sauvegarde $(LIBS)
     
    laby.o : laby.c  laby.h graphics.h
    	$(CC) $(CFLAGS) graphics.o laby.c -o laby $(LIBS)
     
    labyrinthe.o : labyrinthe.c labyrinthe.h graphics.h
    	$(CC) $(CFLAGS) graphics.o labyrinthe.c -o labybyrinthe $(LIBS)
     
    labyrinthe: labyrinthe.o sauvegarde.o laby.o 
    	$(CC) $(CFLAGS) -Wall -o labyrinthe labyrinthe.o sauvegarde.o laby.o $(LIBS)
     
    clean:
    	rm -f *.o
    	rm -f labyrinthe
    	rm -f *.h
    Et j'obtient plein de messages d'erreur du type:

    [labyrinthe.c.text.startup+0x7aa): undefined reference to `Chargercode]Monstre4'
    collect2: ld a retourné 1 code d'état d'exécution
    make: *** [labyrinthe.o] Erreur 1
    [/code]

    merci de votre aide

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 477
    Par défaut
    Bonjour,

    Quand tu fais de la compilation séparée, il faut passer l'option « -c » à GCC pour lui demander de produire des fichiers objets « *.o » et pas l'exécutable final.

    Bon courage.

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 2
    Par défaut
    Merci a toi Obsidian, je n'y avais pas pensé.
    Le Probleme est resolu

  4. #4
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonjour,

    juste pour complémenter le message d'Obsidian, quand tu crées un fichier objet (.o) il faut donner une option qui demande à gcc (ton compilateur) de créer l'objet : c'est l'option -c. Ensuite je vois dans le makefile que tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    laby.o : laby.c  laby.h graphics.h
    	$(CC) $(CFLAGS) graphics.o laby.c -o laby $(LIBS)
    Tu utilises l'otion -o qui dit à gcc quel nom tu désires donner au résultat de la commande. Avec un -o laby tu vas créer un fichier laby et non un fichier nommé laby.o ! Cela doit être source d'erreurs (du genre tu modifies ton code, tu lances un make et aucune modification n'est prise en compte car un fichier laby.o existe et n'est jamais écrasé ...
    Ensuite pour la création d'un fichier objet tu n'as pas besoin de donner en paramètres d'autres fichiers objets ou des biliothèques : cela se fera lors de l'édition des liens (=la création de ton exécutable). Tu n'as besoin que de lui donner le chemin où le compilo trouvera tes headers, quelques defines et surtout les options controllant les warning (un -Wall -Wextra est toujours utile) : c'est en général ce qu'on met dans la variable CFLAGS. Ton makefile devrait donc contenir quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    laby.o : laby.c  laby.h graphics.h
    	$(CC) $(CFLAGS) laby.c -o laby.o
    Même remarque pour les quatre fichiers objets.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 20/04/2013, 13h45
  2. Réponses: 9
    Dernier message: 01/09/2012, 01h50
  3. Réponses: 7
    Dernier message: 13/03/2009, 17h36
  4. Probleme de compilation (undefined reference to)
    Par Verbalinsurection dans le forum C++
    Réponses: 9
    Dernier message: 01/10/2007, 10h50
  5. Réponses: 1
    Dernier message: 19/07/2007, 15h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo