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 :

multiple définition incompréhensible


Sujet :

C++

  1. #1
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut multiple définition incompréhensible
    Bonjour,

    En compilant mon projet j'ai eu une erreur pour le moins surprenante :
    UnixWindows.h:12: erreur : multiple definition of `LD::symboleDossier(std::string&)'
    c:\qtsdk\mingw\bin\..\lib\gcc\mingw32\4.4.0\include\c++\bits\ios_base.h:129: erreur : first defined here
    :-1: erreur : collect2: ld returned 1 exit status
    Sortie de compilation :
    debug/arborescance.o: UnixWindows.h:12: multiple definition of `LD::symboleDossier(std::string&)'
    debug/versionfile.o:c:/qtsdk/mingw/bin/../lib/gcc/mingw32/4.4.0/include/c++/bits/ios_base.h:129: first defined here
    collect2: ld returned 1 exit status
    mingw32-make.exe[1]: *** [debug\Gestionnaire_maj.exe] Error 1
    mingw32-make.exe: *** [debug] Error 2
    16:31:01: Le processus "C:\QtSDK\mingw\bin\mingw32-make.exe" s'est terminé avec le code 2.
    UnixWindows.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
    #ifndef UNIXWINDOWS_H
    #define UNIXWINDOWS_H
     
    #include <string>
     
    namespace LD
    {
        /** @brief Ajoute au chemin passé en paramètre le symbole adéquat : '\' pour les Unix, '/' pour windows
            @param std::string & chemin : chemin auquel ajouté le symbole
            @return std::string & : chemin une fois le symbole ajouté */
        std::string & symboleDossier(std::string & chemin)
        {
            return chemin += '/'; // '\' pour Unix
        }
    }
     
    #endif // UNIXWINDOWS_H
    ios_base :
    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
     inline _Ios_Openmode
      operator&(_Ios_Openmode __a, _Ios_Openmode __b)
      { return _Ios_Openmode(static_cast<int>(__a) & static_cast<int>(__b)); }
     
      inline _Ios_Openmode
      operator|(_Ios_Openmode __a, _Ios_Openmode __b)
      { return _Ios_Openmode(static_cast<int>(__a) | static_cast<int>(__b)); } //c'est à cette ligne qu'il y a une erreur.
     
      inline _Ios_Openmode
      operator^(_Ios_Openmode __a, _Ios_Openmode __b)
      { return _Ios_Openmode(static_cast<int>(__a) ^ static_cast<int>(__b)); }
     
      inline _Ios_Openmode&
      operator|=(_Ios_Openmode& __a, _Ios_Openmode __b)
      { return __a = __a | __b; }
    Si je comprend bien il me dit que la fonction symboleDossier est défini la première fois dans ios_base.

    Par contre si je met la fonction symboleDossier en inline, je n'ai plus de problèmes.
    Je suis un peu perplexe...

    Auriez-vous une idée?

  2. #2
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Bonjour,

    Ce sont les règles de l'ODR. Une fonction non inline ne doit être définie qu'une fois par programme. Or tu implémentes ta fonction dans un header, donc elle se retrouve dans chaque unité de compilation utilisant ce fichier.

    Si tu implémentes une fonction dans un header alors elle doit être inline, sinon mets là dans une unité de compilation.

    Pour ce qui est de la formulation de l'erreur, la description complète n'est pas des plus clair, mais la première partie : "erreur : multiple definition of `LD::symboleDossier(std::string&)'" est en général suffisant pour comprendre que c'est un problème d'ODR.

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Merci beaucoup, j'aurais dû y penser plus tôt je suis vraiment bête sur ce coup là

    Je dois quand même avouer que le message d'erreur ne m'a pas trop mis dans la bonne voie.


    Je pensais que pour ce genre d'erreurs, ils donnaient les différentes inclusions et mettaient les erreurs sur la même ligne :
    Multiple definition of Method()
    In file ...
    In file ...
    First declared in file.h ligne 1
    In file ....
    In file ....
    Redefinition in file.h ligne 1

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

Discussions similaires

  1. comment résoudre un problème de multiple définition
    Par razily dans le forum Débuter
    Réponses: 8
    Dernier message: 24/03/2010, 19h29
  2. [MEX] Fichier de constantes, multiple définition
    Par samlesu dans le forum MATLAB
    Réponses: 3
    Dernier message: 19/10/2009, 00h53
  3. Multiples erreurs incompréhensibles
    Par laposte dans le forum JDBC
    Réponses: 6
    Dernier message: 06/04/2009, 14h14
  4. Réponses: 19
    Dernier message: 05/01/2008, 16h06
  5. [C#] Comment utiliser multiples définitions ?
    Par nesquik dans le forum C#
    Réponses: 4
    Dernier message: 19/06/2006, 17h36

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