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

Visual C++ Discussion :

Erreur LNK2005 " already defined"


Sujet :

Visual C++

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Points : 42
    Points
    42
    Par défaut Erreur LNK2005 " already defined"
    Bonjour,

    J'ai un fichier Const_Msg.h qui contient des déclarations de numéros de message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    int ID_MSG_ENTER_NEW_RESOLUTION	= 0;
    int ID_MSG_WRONG_RESOLUTION= 1;
    int ID_MSG_MODE= 2;
    int ID_MSG_FIXED_OUTPUT= 3;
    int ID_MSG_WIDTH	= 4;
    int ID_MSG_HEIGHT= 5;
    Ce fichier est inclus dans le fichier dxManager.cpp pour utilisation de ces messages.
    D'autre part, winmain.cpp utilise une fonction X (déclarée dans dxManager.h et explicitée dans dxManager.cpp) qui utilise des messages. J'ai donc inclu dans winmain.cpp Const_Msg.h

    A l'édition de lien, erreur LNK2005 :

    "int ID_MSG_ENTER_NEW_RESOLUTION" (?ID_MSG_ENTER_NEW_RESOLUTION@@3HA) already defined in dxManager.obj
    ...


    car double édition de lien sur Const_Msg et j'ai donc modifié Const_Msg.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #ifndef CONST_MSG_H
    #define CONST_MSG_H
     
    int ID_MSG_ENTER_NEW_RESOLUTION	= 0;
    int ID_MSG_WRONG_RESOLUTION= 1;
    int ID_MSG_MODE= 2;
    int ID_MSG_FIXED_OUTPUT= 3;
    int ID_MSG_WIDTH	= 4;
    int ID_MSG_HEIGHT= 5;
     
    #endif
    L'erreur subsiste, pourquoi ? La directive de compilation à priori fait en sorte que Const_Msg.h ne soit incluse qu'une fois ?

    Merci à tous

  2. #2
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 887
    Points : 1 531
    Points
    1 531
    Par défaut
    - Est-ce que tu compiles avec l'option "entêtes précompilés" ? Si oui, essaye de reconstruire le projet.

    - Est-ce que le .h ne contient que ça ? N'y a-t-il pas des includes en plus ?

    - Essaye plutôt avec la directive "#pragma once". Le #ifndef marche pour la compilation d'un cpp, mais si le .h est inclu dans deux cpp, le #define se remet à zéro au début de la compilation du second.

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Points : 42
    Points
    42
    Par défaut
    Le point h contient plusieurs include.
    Il y a pragma once dans chaque fichier .h

    Ou gère t'on les en têtes précompilées ?

  4. #4
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Points : 42
    Points
    42
    Par défaut
    Le problème vient du fait que l'édition de lien voit deux fois la déclaration des messages.
    Je n'ai pas encore trouvé la solution car j'ai besoin des messages à de nombreux endroits du projet ...

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonsoir,
    Tes variables sont définis autant de fois que le fichier d'en-tête est inclus dans un fichier cpp compilé. Il te faut séparer la déclaration des tes variables de leur définition.

    Tu as différentes façon d'aborder ton problème :
    1/Utilisation d'une énumération (ce qui m'a l'air de correspondre à ce que tu fais) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    enum E_ID_Message{
       ID_MSG_ENTER_NEW_RESOLUTION=1,
       ID_MSG_WRONG_RESOLUTION,
       ID_MSG_MODE,
       ID_MSG_FIXED_OUTPUT,
       ID_MSG_WIDTH	,
       ID_MSG_HEIGHT
    };
    Ici tes valeurs ne sont plus contenues das des variables mais directement portées par un type : l'énumération E_ID_Message.

    2/ Séparer la déclaration de la définition :
    déclaration dans l'en-tête : Const_Msg.h
    Code Const_Msg.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifndef CONST_MSG_H
    #define CONST_MSG_H
    extern const int ID_MSG_ENTER_NEW_RESOLUTION;
    extern const int ID_MSG_WRONG_RESOLUTION;
    extern const int ID_MSG_MODE;
    extern const int ID_MSG_FIXED_OUTPUT;
    extern const int ID_MSG_WIDTH;
    extern const int ID_MSG_HEIGHT;
    #endif
    Définition dans un .cpp pour ne les avoir qu'une seule fois :
    Code Const_Msg.cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    const int ID_MSG_ENTER_NEW_RESOLUTION	= 0;
    const int ID_MSG_WRONG_RESOLUTION= 1;
    const int ID_MSG_MODE= 2;
    const int ID_MSG_FIXED_OUTPUT= 3;
    const int ID_MSG_WIDTH	= 4;
    const int ID_MSG_HEIGHT= 5;

    Mais, il me semble quand même que l'enum soit la bonne solution.

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Points : 42
    Points
    42
    Par défaut
    Merci bcp

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Points : 42
    Points
    42
    Par défaut
    La solution 1/ avec enum fonctionne très bien.
    MERCI !

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/11/2011, 14h40
  2. Réponses: 23
    Dernier message: 15/08/2008, 05h14
  3. Réponses: 2
    Dernier message: 31/10/2005, 13h40

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