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 :

compilation linkage include et cie


Sujet :

C++

  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut struct global (voir message à la fin)
    Bonjour,
    je me remet au C/C++ pour les besoin de tests (SDL) en vu de faire un p'tit jeux pour mes enfants

    J'ai recup des tuto ici et là... et je suis en train d'en modifier... j'ai entrepris de découper un exemple en plusieurs fichiers (pour que ca soit moins lourds)
    avant j'avais un fichier main.cpp...
    j'ai entrepris de déplacer des trucs dans un fichier que j'appelle init.cpp
    entre autre uen fonction d'initialisation (d'où le nom )
    bon, autant vous le dire tout de suite, j'ai une variable globale (hou!.. le vilain)
    J'ai mis celà dans init.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_Surface *screen = NULL;
    et dans init.cpp ainsi que dans main.cpp j'utilise ma variable screen.
    bien sûr dans ces deux fichiers j'ai fait un include de init.h

    Quand je compile main.cpp et init.cpp il n'y a pas de probleme...
    mais quand je linke (build-all), j'ai cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    init.obj : error LNK2005: "struct SDL_Surface *  screen" (?screen@@3PAUSDL_Surface@@A) already defined in main.obj
    Est-ce que vous voyez d'ou peut venir ce probleme ?
    Merci.
    PS : compilé avec visual c++.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut
    Si ton objet est inclus deux fois, c'est normal que l'erreur apparaisse car il est considéré défini deux fois.
    Mets un
    au début du code de Init.h

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut
    Citation Envoyé par ep31
    Si ton objet est inclus deux fois, c'est normal que l'erreur apparaisse car il est considéré défini deux fois.
    Mets un
    au début du code de Init.h
    désolé, ca ne marche pas...

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    lorsque tu utilises une variable globale, elle ne doit être déclarée qu'une seule fois. Ici, le compilateur te dis bien qu'elle est déclarée plusieurs fois dans ton code, il ne sait donc pas quelle déclaration est la bonne.

    Lorsque tu souhaite utiliser cette variable dans un autre fichier que celui où elle est déclarée, il faut utiliser le mot-clé extern, pour lui dire que cette variable est déclarée ailleurs. Par ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern SDL_Surface *screen;

  6. #6
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut
    Citation Envoyé par r0d
    Bonjour,

    lorsque tu utilises une variable globale, elle ne doit être déclarée qu'une seule fois. Ici, le compilateur te dis bien qu'elle est déclarée plusieurs fois dans ton code, il ne sait donc pas quelle déclaration est la bonne.

    Lorsque tu souhaite utiliser cette variable dans un autre fichier que celui où elle est déclarée, il faut utiliser le mot-clé extern, pour lui dire que cette variable est déclarée ailleurs. Par ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern SDL_Surface *screen;
    Merci Merci Merci, j'avais oublié le mot clef "extern",
    merci aussi à Laurent Gomila.

  7. #7
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut
    heu j'ai un probleme similaiure, mais c'est une structure et avec le extern ca ne marche pas :

    fichier general.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    extern struct levelname
    	{ std::string current;
    	std::string next; }levelname;
    fichier general.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    struct levelname
    	{ std::string current;
    	std::string next; }levelname;
    cette fois il doit y avoir un truc de plus a faire ?

    J'ai l'erreur suivante :
    general.cpp(22) : error C2011: 'levelname' : 'struct' type redefinition
    Merci de votre aide.

  8. #8
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Non je dirais un truc de moins !

    Dans le .h:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern struct levelname;
    seulement !

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

Discussions similaires

  1. VC++2008: Erreur compilation/linkage LNK2019 LNK1120
    Par grodwar dans le forum Visual C++
    Réponses: 2
    Dernier message: 16/07/2012, 13h57
  2. Réponses: 3
    Dernier message: 19/12/2011, 13h15
  3. Problème de compilation/linkage avec boost::thread
    Par theanthony33 dans le forum Boost
    Réponses: 7
    Dernier message: 26/04/2010, 00h37
  4. Problème de linkage/include avec C::B et wxWidgets
    Par PC1986 dans le forum Code::Blocks
    Réponses: 3
    Dernier message: 16/07/2009, 21h10
  5. Erreur compilation: fichiers Include trop nombreux
    Par Pierrick584 dans le forum C++
    Réponses: 5
    Dernier message: 21/10/2006, 00h24

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