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 :

Pb compilation: définitions multiples


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut Pb compilation: définitions multiples
    Bonjour tout le monde,

    Mon problème est le suivant:
    Je définis dans <compile.h> une variable global <init_compile>.
    J'inclus ce .h , pour me servir de la variable <init_compile>, dans differents .c , qui vont devenir des fichiers objets .o.

    Là, tout se passe bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cc -c -g -DPC -DUNIXIO -I./include -I/usr/include/X11R6 ./src/lib/compile_watersheed.c -o ./linux/obj/compile_watersheed.o
    cc -c -g -DPC -DUNIXIO -I./include -I/usr/include/X11R6 ./src/lib/xutile.c -o ./linux/obj/xutile.o
    En revanche, lorsque je compile l'executable se servant des .o alors j'ai ce message d'erreur.

    Alors j'ai un message de compilation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    cc -g -DPC -DUNIXIO -I./include ./src/com/xfeudeforet.c ./linux/obj/compile_action.o  ./linux/obj/action.o  ./linux/obj/memimage.o ./linux/obj/data.o ./linux/obj/compile_watersheed.o  ./linux/obj/xutile.o -lm -o ./linux/bin/xfeudeforet
    ./linux/obj/xutile.o(.bss+0x0): In function `complement_sentinelle':
    src/lib/xutile.c:12: définitions multiples de « init_compile »
    ./linux/obj/compile_watersheed.o(.bss+0x0):src/lib/compile_watersheed.c:14: défini pour la première fois ici
    collect2: ld a retourné 1 code d'état d'exécution
    make: *** [linux/bin/xfeudeforet] Erreur 1
    Pouvez-vous m'aider,
    merci

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    On ne définit pas une variable dans un header.
    On la déclare seulement.
    Code VarsGlobales.h : Sélectionner tout - Visualiser dans une fenêtre à part
    extern int init_compile;
    Code VarsGlobales.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include "VarsGlobales.h"
     
    int init_compile; /*pas de extern ici */

    Et voilà, tu peux utiliser init_compile depuis n'importe quel fichier source qui inclut VarsGlobales.h...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut
    Merci,
    Cependant j'ai fait une fausse mani
    Le message en entier est le suivant:

    En plus dans le fichier .h, il y a que des variables


    Mon problème est le suivant:
    Je définis dans <compile.h> une variable global <init_compile>.
    J'inclus ce .h , pour me servir de la variable <init_compile>, dans differents .c , qui vont devenir des fichiers objets .o.

    Là, tout se passe bien.
    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cc -c -g -DPC -DUNIXIO -I./include -I/usr/include/X11R6 ./src/lib/compile_watersheed.c -o ./linux/obj/compile_watersheed.o cc -c -g -DPC -DUNIXIO -I./include -I/usr/include/X11R6 ./src/lib/xutile.c -o ./linux/obj/xutile.o
    En revanche, lorsque je compile l'executable se servant des .o alors j'ai ce message d'erreur.

    Alors j'ai un message de compilation:
    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cc -g -DPC -DUNIXIO -I./include ./src/com/xfeudeforet.c ./linux/obj/compile_action.o ./linux/obj/action.o ./linux/obj/memimage.o ./linux/obj/data.o ./linux/obj/compile_watersheed.o ./linux/obj/xutile.o -lm -o ./linux/bin/xfeudeforet ./linux/obj/xutile.o(.bss+0x0): In function `complement_sentinelle': src/lib/xutile.c:12: définitions multiples de « init_compile » ./linux/obj/compile_watersheed.o(.bss+0x0):src/lib/compile_watersheed.c:14: défini pour la première fois ici collect2: ld a retourné 1 code d'état d'exécution make: *** [linux/bin/xfeudeforet] Erreur 1

  4. #4
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par vincho
    Merci,
    Cependant j'ai fait une fausse mani
    Le message en entier est le suivant:

    En plus dans le fichier .h, il y a que des variables


    Mon problème est le suivant:
    Je définis dans <compile.h> une variable global <init_compile>.
    J'inclus ce .h , pour me servir de la variable <init_compile>, dans differents .c , qui vont devenir des fichiers objets .o.

    Là, tout se passe bien.
    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cc -c -g -DPC -DUNIXIO -I./include -I/usr/include/X11R6 ./src/lib/compile_watersheed.c -o ./linux/obj/compile_watersheed.o cc -c -g -DPC -DUNIXIO -I./include -I/usr/include/X11R6 ./src/lib/xutile.c -o ./linux/obj/xutile.o
    En revanche, lorsque je compile l'executable se servant des .o alors j'ai ce message d'erreur.

    Alors j'ai un message de compilation:
    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cc -g -DPC -DUNIXIO -I./include ./src/com/xfeudeforet.c ./linux/obj/compile_action.o ./linux/obj/action.o ./linux/obj/memimage.o ./linux/obj/data.o ./linux/obj/compile_watersheed.o ./linux/obj/xutile.o -lm -o ./linux/bin/xfeudeforet ./linux/obj/xutile.o(.bss+0x0): In function `complement_sentinelle': src/lib/xutile.c:12: définitions multiples de « init_compile » ./linux/obj/compile_watersheed.o(.bss+0x0):src/lib/compile_watersheed.c:14: défini pour la première fois ici collect2: ld a retourné 1 code d'état d'exécution make: *** [linux/bin/xfeudeforet] Erreur 1
    Hé bien, c'est justement ce que t'expliques Médinoc. Il faut utiliser le mot-clé extern pour exporter/importer ta variable globale et ne définir cette dernière qu'une seule fois, soit dans un seul .c. Ainsi, tu n'auras pas d'erreurs de définitions mutliples à l'édition des liens comme râle ici le linker.
    Sinon, c'est que la variable globale a une seconde définition.

    A+

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut
    Merci,

    J'ai compris, on déclare dans le header puis on doit - à chaque fois - que l'on utilise dans .c la définir.

    Mais justement c'est le chaque fois qui me dérange

    Je vais trouver une solution... Peut-être en rajoutant une macro incluant toutes les définitions...

    Merci

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    On peut voir la déclaration dans le header?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut
    Voilà la modification que j'ai apporté.

    J'ajoute en plus du #include<compile.h>
    def_compile;


    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
     
    extern struct xvpeu_tab  in_act_peu_tab , out_peu_tab;
    extern struct xvspace_tab   boule_without_origine;
    extern struct xvspace compile_x;
    extern int peu_compile;
    extern int i_peu;
    extern int i_act;
    extern int compile_place;
    extern int  init_compile;
     
    #define def_compile \
       struct xvpeu_tab  in_act_peu_tab , out_peu_tab;\
     struct xvspace_tab   boule_without_origine;\
     struct xvspace compile_x;\
     int peu_compile;\
     int i_peu;\
     int i_act;\
     int compile_place;\
     int  init_compile;
    Avant j'avais juste ce qui il y a dans def_compile.

    Ps: il faudrait qu'un jour je normalise les noms de mes variables
    PPS:En même temps, mon code est un pseudo_langage(C->C) et ces variables se retrouvent dans le code généré donc plus elle sont un peu n'importe quoi, pus les gens ne comprendront rien, ce qui est dans un sens bien

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    1. compile.h n'est pas un header standard, tu me remplaces ces <> par des "".
    2. Tu ne mets bien def_compile que dans un seul fichier source?
      Et vérifie qu'il n'y a pas de problème au niveau de tes \ : Si la #define se termine trop tôt, je ne suis même pas sûr que le compilo te le signale...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Définition multiple
    Par Goundy dans le forum C
    Réponses: 7
    Dernier message: 02/04/2006, 18h59
  2. définition multiple
    Par elekis dans le forum C++
    Réponses: 3
    Dernier message: 01/03/2006, 16h32
  3. [g++] Définitions multiples
    Par GLDavid dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 12/12/2005, 16h04
  4. Réponses: 2
    Dernier message: 17/10/2005, 18h55
  5. Réponses: 22
    Dernier message: 05/07/2005, 00h04

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