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

Bibliothèques Discussion :

Problème de linker?


Sujet :

Bibliothèques

  1. #1
    Membre régulier
    Homme Profil pro
    Cocher moderne
    Inscrit en
    Septembre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Oman

    Informations professionnelles :
    Activité : Cocher moderne

    Informations forums :
    Inscription : Septembre 2006
    Messages : 50
    Points : 118
    Points
    118
    Par défaut Problème de linker?
    Bonjour,

    Je code une petite application avec quelques classes. Certaines sont petites, et j'ai mis les méthodes à la suite de la définition de la classe, dans le fichier .h. Genre:

    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
     
    class MaClasse
    {
    public:
       MaClasse();
    private:
       Attribut monattribut;
       void maMethode();
    };
     
    MaClasse::MaClasse()
    {
    // Definition du constructeur
    }
     
    void
    MaClasse::maMethode()
    {
    // Definition de maMethode()
    }
    Tout allait bien.

    Puis j'ai défini une plus grosse classe, et j'ai alors utilisé un fichier .cpp pour en définir les méthodes.
    Et alors d'un coup d'un seul, GNU GCC compiler me dit de chacune des méthodes définies dans les fichiers .h (les autres classes, donc, les "petites") qu'elles sont définies plusieurs fois. Mais les deux fois dont il parle sont la même ligne, donc la même définition. Aucune erreur concernant la grosse classe.

    Je peux résoudre cette erreur en déclarant ces fonctions "inline".

    Est-ce-que tout cela est bien normal?

    Merci.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 307
    Points : 983
    Points
    983
    Par défaut
    Oui c'est normal, ces méthodes se retrouvent dans 2 unites de compilations (les 2 fichiers qui incuent le header). C'est la regle ODR.
    http://en.wikipedia.org/wiki/One_Definition_Rule

    Tu peux les mettre inline ; sinon tu mets toutes ces methodes dans un autre .cpp qui sera compilé et lié avec le reste.

  3. #3
    Membre régulier
    Homme Profil pro
    Cocher moderne
    Inscrit en
    Septembre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Oman

    Informations professionnelles :
    Activité : Cocher moderne

    Informations forums :
    Inscription : Septembre 2006
    Messages : 50
    Points : 118
    Points
    118
    Par défaut
    OK, compris.
    Du coup, les inline dans le header avec le mot-clé et les autres dans le .cpp qui va bien.
    Merci beaucoup pour la réponse!

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

Discussions similaires

  1. [Lazarus] Problème de linker
    Par grandoud dans le forum Lazarus
    Réponses: 2
    Dernier message: 29/06/2007, 21h15
  2. Problème de linker commercial vs gcc/ld
    Par TheOyoStyledMan dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 15/06/2006, 22h46
  3. Problème pour linker la lib d'une Dll
    Par damien99 dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 23/02/2006, 23h20
  4. Problème de linker à la compilation
    Par screeminelle dans le forum C++
    Réponses: 8
    Dernier message: 27/10/2005, 16h20
  5. [Debutant] Problème du linker [Dev-c++4]
    Par Macdir dans le forum Dev-C++
    Réponses: 3
    Dernier message: 30/05/2003, 20h50

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