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

Langage C++ Discussion :

erreur de link definitions multiples


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2024
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2024
    Messages : 45
    Par défaut erreur de link definitions multiples
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    /usr/bin/ld : /tmp/ccY4DTYA.o:(.bss+0x0) : définitions multiples de « textureDesBlocs »; /tmp/cc4XFrpo.o:(.bss+0x0) : défini pour la première fois ici
    /usr/bin/ld : /tmp/ccY4DTYA.o:(.bss+0x30) : définitions multiples de « lesBlocs »; /tmp/cc4XFrpo.o:(.bss+0x30) : défini pour la première fois ici
    /usr/bin/ld : /tmp/ccY4DTYA.o:(.bss+0x60) : définitions multiples de « selection »; /tmp/cc4XFrpo.o:(.bss+0x60) : défini pour la première fois ici
    collect2: error: ld returned 1 exit status
    Bien le bonjour !
    Ce sont des variables globales.
    elles sont déclarées dans un .hpp avec "pragma once"

    et le .hpp est 'include' dans 2 fichiers .cpp...

    Je comprend mal ou se trouve mon erreur...

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 556
    Par défaut
    Cela signifie que tu as déclaré des objets portant le même nom dans différentes unités de compilation, débouchant chacune sur leur propre *.o, et qu'au moment de les assembler pour former l'exécutable final, il y a forcément conflit entre les deux.

    À mon avis, tu as déclaré des variables globales dans un *.h au même endroit que tes fonctions. Quand tu écris un prototype de fonction, tu ne fais que déclarer l'existence de la fonction et sa convention d'appel. Quand tu déclares une variable, en revanche, tu l'instancies et c'est pour ça que tu la retrouves dans tous les fichiers qui ont inclus ton *.h.

    Il faut utiliser extern devant ta déclaration de variable pour indiquer qu'elle se trouve à l'extérieur du fichier, puis, choisir un et un seul fichier source *.cpp dans lequel elle sera effectivement instanciée.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2024
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2024
    Messages : 45
    Par défaut
    J ai declaré mes variables globales dans un des .cpp...
    ...Et les ai "redeclarees" avec des 'extern' dans l autre .cpp...

    Et l erreur a disparu.

    Comment se fait il qu une declaration dans un .hpp alors qu il y a une condition qui evite les inclusions multiples fasse passer ca pour une definition multiple ?
    Je ne comprend pas.....

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2024
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2024
    Messages : 45
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Cela signifie que tu as déclaré des objets portant le même nom dans différentes unités de compilation, débouchant chacune sur leur propre *.o, et qu'au moment de les assembler pour former l'exécutable final, il y a forcément conflit entre les deux.

    À mon avis, tu as déclaré des variables globales dans un *.h au même endroit que tes fonctions. Quand tu écris un prototype de fonction, tu ne fais que déclarer l'existence de la fonction et sa convention d'appel. Quand tu déclares une variable, en revanche, tu l'instancies et c'est pour ça que tu la retrouves dans tous les fichiers qui ont inclus ton *.h.

    Il faut utiliser extern devant ta déclaration de variable pour indiquer qu'elle se trouve à l'extérieur du fichier, puis, choisir un et un seul fichier source *.cpp dans lequel elle sera effectivement instanciée.
    oups...
    merci de votre reponse...

    est ce que je devrais creer un .hpp expres pour mes variables globales ?

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 556
    Par défaut
    Citation Envoyé par GraineDeDev Voir le message
    Comment se fait il qu une declaration dans un .hpp alors qu il y a une condition qui evite les inclusions multiples fasse passer ca pour une definition multiple ?
    Je ne comprend pas.....
    Si la « condition évitant les inclusions multiples » est la traditionnelle garde en début de fichier :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #ifndef MON_FICHIER
    #define MON_FICHIER
     
    #endif

    Alors tu es bien protégé contre les ré-inclusions (spécialement lorsque différents headers *.hpp s'appuient eux-mêmes sur un même fichier initial) mais chaque unité de compilation *.cpp est compilée de manière indépendante, en rappelant le compilateur depuis zéro pour chacune d'elles. Donc, techniquement, c'est toujours la première fois pour chacune d'elles.

    est ce que je devrais creer un .hpp expres pour mes variables globales ?
    Non, il faut bien les mettre là où ça a le plus de sens, mais il ne faut mettre que des déclarations dans un *.hpp. Et pour cela, il faut bien garder à l'esprit la façon dont ça fonctionne. Prototype de fonction seul = déclaration de fonction (sans définition) ; déclaration de variable = instanciation, sauf si on la déclare explicitement extern.

    Avec cela on peut souligner que :

    — Il y a encore une subtilité supplémentaire avec les template ;
    — Un *.h ou *.hpp est en réalité un fichier totalement ordinaire. Lorsqu'il rencontre une directive #include, le compilateur lit le fichier indiqué et insère directement son contenu en lieu et place de la directive, quel que soit son contenu. À dire vrai, c'est même le pré-processeur qui effectue cela avant même que le compilateur proprement dit entre en jeu.

  6. #6
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 171
    Billets dans le blog
    4
    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.

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2024
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2024
    Messages : 45
    Par défaut
    Un grand merci pour vos éclairages...

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

Discussions similaires

  1. [Erreur] : définitions multiples de
    Par lefou123456 dans le forum C++
    Réponses: 8
    Dernier message: 15/11/2017, 15h29
  2. Erreur de définition multiple d'une variable
    Par SmileSoft dans le forum Débuter
    Réponses: 6
    Dernier message: 08/02/2013, 11h11
  3. erreur de link(age) g++
    Par corwin dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 05/05/2004, 12h33
  4. [wxWindows] Erreur de link pour ODBC
    Par ovh dans le forum wxWidgets
    Réponses: 3
    Dernier message: 28/01/2004, 16h38
  5. DirectDrawCreate erreur de link
    Par Ing_Ben dans le forum DirectX
    Réponses: 1
    Dernier message: 01/12/2002, 19h46

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