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 :

"error LNK2005: " à cause d'une fonction


Sujet :

C++

  1. #1
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut "error LNK2005: " à cause d'une fonction
    Hello

    Dans un header nommé documented.h j'ai ecris la definition suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    VOID NTAPI HalReadWritePCISpace
    (
      IN ULONG   BusNumber,
      IN ULONG   SlotNumber,
      IN ULONG   RegisterNumber,
      IN PVOID   Buffer,
      IN ULONG   Length,
      IN BOOLEAN WritePCISpace
    )
    {
        return;
    }
    Dès lors des que j'inclue dans un entête documented.h j'ai ce message et je comprend pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    pci.obj : error LNK2005: "void __stdcall HalReadWritePCISpace(unsigned long,unsigned long,unsigned long,void *,unsigned long,unsigned char)" (?HalReadWritePCISpace@@YGXKKKPAXKE@Z) already defined in main.obj
    Debug/test.exe : fatal error LNK1169: one or more multiply defined symbols found
    Auriez vous une solution SVP?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    N'aurais tu pas, par le plus grand des hasards, inclus le fichier d'implémentation (*.cpp) qui contient cette fonction dans ton fichier main.cpp

    N'as tu pas encore compris qu'il ne fallait JAMAIS inclure un fichier .cpp, qu'il n'y avait que les fichier d'en-tête qui devait être utilisés avec la directive #include
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Et il ne faut jamais définir de fonction dans un fichier header.
    A chaque inclusion du header la fonction sera créée et recréée, ce qui est l'erreur que tu obtiens.

  4. #4
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut
    Merci

    J'ai inclu aucun .cpp nul part parcontre je n'ai fait dans documented.h qu'une définition. Du coup j'ai essayé de faire une déclaration dans le documented.h et à la compilation aucun souci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    VOID NTAPI HalReadWritePCISpace
    (
      IN ULONG   BusNumber,
      IN ULONG   SlotNumber,
      IN ULONG   RegisterNumber,
      IN PVOID   Buffer,
      IN ULONG   Length,
      IN BOOLEAN WritePCISpace
    );
    Par contre dès que je créer le documented.cpp et que j'inclue le documented.h j'ai un paquet d'erreur sans même avoir écrit une ligne:

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
     
    Compiling...
    undocumented.cpp
    c:\...\documented.h(33) : error C2146: syntax error : missing ';' before identifier 'NTSTATUS'
    c:\...\documented.h(33) : error C2501: 'NTSTATUS' : missing storage-class or type specifiers
    c:\...\documented.h(43) : error C2146: syntax error : missing ';' before identifier 'SHORT'
    c:\...\documented.h(43) : error C2146: syntax error : missing ';' before identifier 'CSHORT'
    c:\...\documented.h(43) : error C2501: 'SHORT' : missing storage-class or type specifiers
    c:\...\documented.h(43) : error C2501: 'CSHORT' : missing storage-class or type specifiers
    c:\...\documented.h(47) : error C2143: syntax error : missing ';' before '*'
    c:\...\documented.h(47) : error C2501: 'PSZ' : missing storage-class or type specifiers
    c:\...\documented.h(48) : error C2143: syntax error : missing ';' before '*'
    c:\...\documented.h(48) : error C2501: 'PCSZ' : missing storage-class or type specifiers
    c:\...\documented.h(53) : error C2146: syntax error : missing ';' before identifier 'Length'
    c:\...\documented.h(53) : error C2501: '_STRING::USHORT' : missing storage-class or type specifiers
    c:\...\documented.h(53) : error C2501: '_STRING::Length' : missing storage-class or type specifiers
    c:\...\documented.h(54) : error C2146: syntax error : missing ';' before identifier 'MaximumLength'
    c:\...\documented.h(54) : error C2501: '_STRING::USHORT' : missing storage-class or type specifiers
    c:\...\documented.h(54) : error C2501: '_STRING::MaximumLength' : missing storage-class or type specifiers
    c:\...\documented.h(55) : error C2146: syntax error : missing ';' before identifier 'Buffer'
    c:\...\documented.h(55) : error C2501: '_STRING::PCHAR' : missing storage-class or type specifiers
    c:\...\documented.h(55) : error C2501: '_STRING::Buffer' : missing storage-class or type specifiers
    c:\...\documented.h(67) : error C2146: syntax error : missing ';' before identifier 'Status'
    c:\...\documented.h(67) : error C2501: '_IO_STATUS_BLOCK::__unnamed::NTSTATUS' : missing storage-class or type specifiers
    c:\...\documented.h(67) : error C2501: '_IO_STATUS_BLOCK::__unnamed::Status' : missing storage-class or type specifiers
    c:\...\documented.h(68) : error C2146: syntax error : missing ';' before identifier 'Pointer'
    c:\...\documented.h(68) : error C2501: '_IO_STATUS_BLOCK::__unnamed::PVOID' : missing storage-class or type specifiers
    c:\...\documented.h(68) : error C2501: '_IO_STATUS_BLOCK::__unnamed::Pointer' : missing storage-class or type specifiers
    c:\...\documented.h(71) : error C2146: syntax error : missing ';' before identifier 'Information'
    c:\...\documented.h(71) : error C2501: '_IO_STATUS_BLOCK::ULONG_PTR' : missing storage-class or type specifiers
    c:\...\documented.h(71) : error C2501: '_IO_STATUS_BLOCK::Information' : missing storage-class or type specifiers
    c:\...\documented.h(77) : error C2065: 'NTAPI' : undeclared identifier
    c:\...\documented.h(77) : error C2065: 'PIO_APC_ROUTINE' : undeclared identifier
    c:\...\documented.h(77) : error C2501: 'VOID' : missing storage-class or type specifiers
    c:\...\documented.h(77) : fatal error C1903: unable to recover from previous error(s); stopping compilation
    J'ai ces erreurs que dans ce cas là.

  5. #5
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Tu nous indiques un fichier de 10 lignes qui a des erreurs qui apparaissent de la ligne 33 à la ligne 77, ça ne pas facile du tout pour pouvoir t'aider!

    Au feeling, je dirais qu'il manque des #include dans le fichier documented.h.

  6. #6
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut
    En fait pour l'instant tant que je definis dans documented.h toute les fonctions pas de probleme mais si je fais sa dans un .cpp j'ai des erreur.

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Tu nous indiques un fichier de 10 lignes qui a des erreurs qui apparaissent de la ligne 33 à la ligne 77, ça ne pas facile du tout pour pouvoir t'aider!

    Au feeling, je dirais qu'il manque des #include dans le fichier documented.h.
    En fait, il y a de très fortes chances pour que le compilateur ait en réalité "perdu les pédales" à la ligne 33, lorsqu'il n'a pas compris ce que représentait NTSTATUS (qui n'apparait d'ailleurs pas dans le code montré ), et que les autres erreurs ne soient que des "faux positifs" induits par cette "perte des pédales".

    Mais, de fait, je dirais sensiblement la même chose au feeling
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Nono Sto Voir le message
    En fait pour l'instant tant que je definis dans documented.h toute les fonctions pas de probleme mais si je fais sa dans un .cpp j'ai des erreur.
    Ben oui, mais il y a des règles pour définir les fonctions dans un fichier d'en-tête...

    La principale d'entre-elles étant que tu dois t'assurer que l'éditeur de liens considérera qu'il est "normal" de se retrouver avec plusieurs implémentations (au niveau du code binaire généré) de la même fonction; par exemple, en la déclarant inline.

    Et, de toutes manières, le fait de déporter la définition d'une fonction dans un fichier d'implémentation ne devrait pas avoir de répercussion sur l'analyse du fichier d'en-tête dans lequel elle se trouvait à l'origine.

    "Dans le pire des cas", l'implémentation déportée sera dans un fichier qui ne sera pas compilé à cause d'un problème de définition du projet, ce qui se traduira par une erreur lors de l'édition de liens.

    Si bien que, au vu des deux situations dont nous avons connaissance, à savoir:
    1. l'implémentation d'une fonction dans le fichier d'en-tête qui compile mais provoque une erreur à l'édition de liens et
    2. l'implémentation d'une fonction dans un fichier d'implémentation qui provoque une erreur de compilation lors de l'analyse du fichier d'en-tête

    je suis désolé d'avoir à te le dire, mais il n'y a qu'une seule conclusion à tirer: tu as de toutes évidence fait "une connerie" en déportant la fonction qui posait problème, sans doute en supprimant l'inclusion d'un fichier d'en-tête que tu auras peut-être jugé (à tors) comme inutile
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  9. #9
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut
    Le problème est que j'ai du récupérer ce fameux documented.h et il est délicat à modifier. Du coup la meilleur solution est d'ajouter les définitions des quelques fonctions que je dois ajouter dans le documented.h. Alors quels conseil me donneriez vous SVP pour essayé de faire sa propre?

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Tu utilises quel compilateur ?
    Est-il trop stupide pour redéfinir la fonction à chaque include plutôt que de l'inliner ?
    Puisque tu implémentes la fonction dans un fichier header, pourquoi n'est-elle pas inline ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je sais qu'on dit parfois que lorsqu'on écrit une implémentation, il est de bon ton de commencer par le #include spécifique, mais dans le cas d'un dev Windows, je pense que commencer par <windows.h> (ou si l'on utilise des en-têtes précompilés, "stdafx.h") prend le pas sur cette règle de style.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. [PHP 5.3] [POO] : faire une fonction quote
    Par gwendoline-bricout dans le forum Langage
    Réponses: 7
    Dernier message: 20/02/2014, 10h41
  2. Réponses: 2
    Dernier message: 25/08/2011, 17h04
  3. "Missing right parenthesis" à cause d'une fonction dans l'ORDER BY
    Par logari dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 12/05/2010, 14h18
  4. Chaîne tronquée à cause d'une quote
    Par Didier77 dans le forum Langage
    Réponses: 5
    Dernier message: 17/06/2008, 14h43
  5. Réponses: 8
    Dernier message: 20/11/2006, 12h49

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