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 :

ERREUR LIEN LNK1169


Sujet :

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 LIEN LNK1169
    Bonjour,

    Je travaille sur un projet contenant plusieurs classes donc plusieurs .cpp et .h
    J'ai créé de plus un fichier Toolbox.h incluant diverses fonctions que j'utilise dans les différents .cpp

    Je me retrouve avec une erreur LNK1169 suivant LNK 2005

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1>Instrument.obj : error LNK2005: "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl get_ExcelParameter(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int)" (?get_ExcelParameter@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@H@Z) already defined in Directory.obj
    1>Turn_For_You.obj : error LNK2005: "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl get_ExcelParameter(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int)" (?get_ExcelParameter@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@H@Z) already defined in Directory.obj
    1>D:\T4U Project\Debug\T4U Project.exe : fatal error LNK1169: one or more multiply defined symbols found
    Apparemment, cela vient du fait de déclarations ou d'inclusions multiples.

    Comment puis je m'en sortir ?

    Merci à tous

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    Vous ne devez avoir que les déclarations de fonctions dans les .h.

    Les définitions de ces fonctions doivent être dans un cpp.

  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
    Voilà ce que je viens de faire :

    j'ai mis #pragma once dans chaque fichier .h

    Mais cela ne corrige p

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    C'est une erreur de LINK, pas de compilation.
    Vérifiez ma remarque.

  5. #5
    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
    Voilà ce que je viens de faire :

    j'ai mis #pragma once dans chaque fichier .h

    Mais cela ne corrige pas le pb.

    Ce qu'il faut dire est que Toolbox.h ne contient QUE des fonctions incluant un template.

    J'ai donc ajouté un template à la fonction que j'avais ajoutée dans Toolbox.h

    Et cela compile très bien ...
    Cela rejoint ce que vous dites

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    get_ExcelParameter est une fonction ou une méthode.

    Pourquoi est-elle définit dans Directory.cpp, Instrument.cpp et Turn_For_You.cpp.
    Je dis bien défini et pas déclaré (elle l'est mais ce n'est pas le problème).

  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
    Toolbox.h ne contient que des fonctions indépendantes de toute classe. Elles sont toutes définies à partir d'un template.
    Par contre, getExcelParameter ne l'est pas. Il faut peut être que je la place dans Toolbox.cpp ?

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    Quand vous définissez un template (de classe ou de fonction) dans un .h, vous ne définissez pas du code au sens propre mais un patron de code.
    C'est le compilateur qui définira du code à chaque instanciation du template (par instanciation d'un template, c'est renseigner les classes du patron).
    C'est au compilateur de ne pas faire de double définition lors des instanciations de template.
    Si getExcelParameter est une fonction "standard", sa définition génère du code. Si la définition est dans le .h, il y aura autant de génération de code que d'inclusion du .h dans un cpp différent, d'où le problème.

    Alors, soit vous faite de getExcelParameter une fonction tempalte soit vous localisez sa définition dans un .cpp.

  9. #9
    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 beaucoup.

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

Discussions similaires

  1. erreur lien erroné
    Par sub-0 dans le forum Langage
    Réponses: 5
    Dernier message: 17/04/2010, 22h11
  2. erreur lien avec "Image Menu"
    Par beta1204 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 23/04/2009, 10h06
  3. [Apache2] erreur liens symboliques
    Par nihilite dans le forum Apache
    Réponses: 6
    Dernier message: 20/01/2008, 11h12
  4. Message d'erreur lien hypertexte
    Par FCL31 dans le forum IHM
    Réponses: 3
    Dernier message: 31/08/2007, 11h58

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