Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme de Multiple Definition

    3 novembre 2006 à 17:04:26

    Salut à tous

    j'ai besoin d'un petit coup de pouce

    Je suis entrain de créer un petit programme pour mon bts donc comme ce n'est pas pour moi je me suis dis je vais mettre les formes (c-a-d ne pas tout mettre dans le main ^^ )

    Donc j'ai séparé mes fonctions dans des fichiers sources et des headers malheureusement j ai obtenu une erreur de compilation.

    Citation : compiler Dev-C++

    Compilateur: Default compiler
    Building Makefile: "C:\Documents and Settings\Administrateur\Bureau\garage_amelioré2\Makefile.win"
    Exécution de make...
    make.exe -f "C:\Documents and Settings\Administrateur\Bureau\garage_amelioré2\Makefile.win" all
    gcc.exe main.o menu.o fonction_clavier.o divers.o animation.o -o "Garage.exe" -L"C:/Dev-Cpp/lib" -windows -lmingw32 -lSDLmain -lSDL C:/Dev-Cpp/mingw32/lib/SDL_image.lib ../../../../../Dev-Cpp/mingw32/lib/libfmod.a ../../../../../Dev-Cpp/mingw32/lib/SDL_ttf.lib

    menu.o(.bss+0x0):menu.c: multiple definition of `ecran'
    main.o(.bss+0x0):main.c: first defined here

    menu.o(.bss+0x4):menu.c: multiple definition of `couleur Noire'

    main.o(.bss+0x4):main.c: first defined here
    menu.o(.data+0x0):menu.c: multiple definition of `couleur Blanche'

    main.o(.data+0x0):main.c: first defined here
    menu.o(.data+0x4):menu.c: multiple definition of `couleurDif'
    main.o(.data+0x4):main.c: first defined here
    divers.o(.bss+0x0):divers.c: multiple definition of `ecran'
    main.o(.bss+0x0):main.c: first defined here
    divers.o(.bss+0x4):divers.c: multiple definition of `couleur Noire'
    main.o(.bss+0x4):main.c: first defined here
    divers.o(.data+0x0):divers.c: multiple definition of `couleurBlanche'
    main.o(.data+0x0):main.c: first defined here
    divers.o(.data+0x4):divers.c: multiple definition of `couleurDif'
    main.o(.data+0x4):main.c: first defined here
    collect2: ld returned 1 exit status

    make.exe: *** [Garage.exe] Error 1

    Exécution terminée



    Donc j'ai un probleme de multiple definition de differentes variables.
    Elles sont toutes inclues dans:

    variable_globale.h
    /*
    variable_globale.h
    -----------

    Par Spygon
    Dernière modification : 3/11/06

    Description : gère les menus

    */


    #ifndef DEF_VARIABLE
    #define DEF_VARIABLE

    //ecran principal
    SDL_Surface *ecran = NULL;

    //coordonnées de l'ecran
    SDL_Rect position_ecran;

    //Couleur utilisees dans le logiciel
    SDL_Color couleurNoire = {0, 0, 0}, couleurBlanche = {255, 255, 255}, couleurDif ={133,144,255};

    #endif


    avant de poster j'ai chercher sur le forum et j'ai vu que pas mal de personnes avaient ce probleme et que c'etait du au fait qu'ils incluaient des .c dans d'autre .c ce qui n'est pas mon cas j'ai aussi verifie que c'est variables ne soient pas definis autre part et ce n'est pas le cas

    les sources completes sont disponibles ICI

    merci d'avance s'il vous faut quelque chose d'autre dite le moi (je suppose qu'ils vous faut le code complet mais c'est vraiment trop long mais si vous pouvez pas le telecharger chez vous je le mettrais sur ce post)


    Ps: le code n'est pas indenté je sais je comptais le faire plus tard et certaines parties du code ne servent a rien car elles auront une utilité plus tard.
    • Partager sur Facebook
    • Partager sur Twitter
      3 novembre 2006 à 17:26:57

      Salut,

      Si j'ai bien compris, tes sources sont destinées à être distribuées.

      Alors là, directement deux remarques : indente ton code comme il faut, car là c'est illisible, et vire les variables globales, c'est impossible de comprendre correctement un code avec des variables globales (vu qu'elle peuvent être modifiés à n'importe quel moment par une fonction).

      Ton problème se résoudra alors de lui même.

      Une petite citation :

      Citation : cours de M@teo21

      Il est possible de déclarer des variables qui sont accessibles dans toutes les fonctions de tous les fichiers du projet. Je vais vous montrer comment faire pour que vous sachiez que ça existe, mais généralement il faut éviter de le faire. Ca aura l'air de simplifier votre code au début, mais après vous risquez de vous retrouver avec plein de variables accessibles partout, ce qui risquera de vous poser des soucis.

      • Partager sur Facebook
      • Partager sur Twitter
        3 novembre 2006 à 17:31:39

        Ce n'est pas pour être distribue
        J'y ai pense a les enlever mais avant j'aurai aimé comprendre pourquoi il y a une erreur de multiple définition

        sinon je sais que c'est illisible vu que je n'ai pas du tout intenté que je sais déjà où je peux optimiser mon code pour le rendre plus fluide et plus lisible mais pour l'instant je veux juste qu'il se compile
        mais merci de ta réponse

        edit: je pense quand même garder mes couleurs en variable globale je pense pas que ce soit si embêtant que ca surtout que je risque d'en avoir une bonne quinzaine a la fin ca me soulera de devoir les réecrire a chaque fois
        • Partager sur Facebook
        • Partager sur Twitter
          3 novembre 2006 à 17:35:43

          Ne pas mettre de définitions dans un fichier d'en-tête, seulement les déclarations.

          /* foo.h */
          extern bar foo;

          /* foo.c */
          bar foo;
          • Partager sur Facebook
          • Partager sur Twitter
            3 novembre 2006 à 17:42:37

            Ceci est une définition de variable globale :

            SDL_Surface *ecran = NULL;

            Cela réserve la mémoire associée à la variable ecran.

            Ceci est une déclaration seule de variable globale :

            extern SDL_Surface *ecran;

            Cela informe le compilateur de l'existence d'une variable ecran de type SDL_Surface *.

            Maintenant, si tu places la définition dans un en-tête comme tu le fais ; tu inclues l'en-tête (.h) dans plusieurs fichiers sources (.c) et tu te retrouves à créer plusieurs fois la variable, d'où le conflit. Il faut une seule définition quelque part et une déclaration dans chaque fichier qui l'utilise, soit une déclaration dans l'en-tête que tu inclues partout.
            • Partager sur Facebook
            • Partager sur Twitter
              3 novembre 2006 à 18:12:38

              j'ai compris
              j'ai essaye ca marche mais ca enleve tout le principe de ne pas s'embeter à retapper

              c'est vrai que c'est nul les variables globales lol

              je me coucherai moins bête ce soir

              j'ai creer une fonction a la place pour definir mes couleurs et eviter de les retaper

              merci rz0 et bon courage pour ta prepa
              • Partager sur Facebook
              • Partager sur Twitter
                3 novembre 2006 à 20:40:17

                Citation : spygon

                Je suis entrain de créer un petit programme pour mon bts
                <...>
                Donc j'ai un probleme de multiple definition de differentes variables.
                Elles sont toutes inclues dans:

                variable_globale.h

                /*
                variable_globale.h
                -----------

                Par Spygon
                Dernière modification : 3/11/06

                Description : gère les menus

                */


                #ifndef DEF_VARIABLE
                #define DEF_VARIABLE

                //ecran principal
                SDL_Surface *ecran = NULL;

                //coordonnées de l'ecran
                SDL_Rect position_ecran;

                //Couleur utilisees dans le logiciel
                SDL_Color couleurNoire = {0, 0, 0}, couleurBlanche = {255, 255, 255}, couleurDif ={133,144,255};

                #endif



                Horrible.
                1 - Les globales, c'est le démon. :diable:
                2 - Si tu ne peux pas faire autrement (j'en doute, ou alors tu n'es pas en TS2), dans le .h, on ne met que les déclarations (avec extern).

                http://mapage.noos.fr/emdel/notes.htm#globales
                • Partager sur Facebook
                • Partager sur Twitter
                Music only !

                Probleme de Multiple Definition

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown