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 :

Étrange 'undefined reference'


Sujet :

Langage C++

  1. #1
    Membre habitué
    Avatar de Glân von Brylân
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2014
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2014
    Messages : 133
    Points : 186
    Points
    186
    Par défaut Étrange 'undefined reference'
    Bonjour,

    J'étais en train de programmer mon petit jeu avec la SFML...tranquille...(à noter que ce n'est pas mon premier et que je ne pense pas que ce soit la SFML qui pose problème, mais passons).

    Pour faire simple, j'ai un fichier Lang.h :
    Code cpp : 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
    #ifndef LANG_H_INCLUDED
    #define LANG_H_INCLUDED
     
     
    #include <SFML/System/String.hpp>
     
     
    struct Lang
    {
        void switchToEN()
        {
            L_newScore = "NEW RECORD !";
            L_pressSPACE = "Press SPACE to start a new game";
            L_time = "Elapsed time : ";
            L_errors = "Errors : ";
        }
     
        void switchToFR()
        {
            L_newScore = "NOUVEAU RECORD !";
            L_pressSPACE = "Appuyez sur ESPACE pour commencer une nouvelle partie";
            L_time = "Temps écoulé : ";
            L_errors = "Erreurs : ";
        }
     
        static sf::String L_newScore;
        static sf::String L_pressSPACE;
        static sf::String L_time;
        static sf::String L_errors;
    };
     
     
     
    #endif // LANG_H_INCLUDED


    Un fichier Game.h :
    Code cpp : 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
    #define GAME_H
     
     
    #include <ctime>
    #include <cstdlib>
    #include <cmath>
    #include <iostream>
    #include <SFML/System/Clock.hpp>
    #include <SFML/Window/Event.hpp>
    #include <SFML/Graphics/RenderWindow.hpp>
    #include <SFML/Graphics/Texture.hpp>
    #include <SFML/Graphics/Sprite.hpp>
    #include <SFML/Graphics/CircleShape.hpp>
    #include <SFML/Graphics/RectangleShape.hpp>
    #include <SFML/Graphics/Text.hpp>
     
    #include "Lang.h"
     
     
    class Game
    {
        public:
            Game(std::int8_t difficulty = 1);
     
            ~Game();
     
            // blah blah, blah, blablah.
     
    }

    Et un fichier Game.cpp dans lequel j'ai des erreurs :
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "Game.h"
     
     
    Game::Game(std::int8_t difficulty) : window(), event(), playing(false), newRecord(false), clock(),
                                        difficultyMode(difficulty), target(0, 0, 50, 50),
                                        t_background(), t_colors(), background(), tip(16),
                                        marlboro(), newScoreMessage(Lang::L_newScore, marlboro, 60), pressSPACEtoContinue(Lang::L_pressSPACE, marlboro),            // ERREURS
                                        elapsedTimeText(Lang::L_time, marlboro), elapsedTime("0", marlboro), errorsText(Lang::L_errors, marlboro), errors("0", marlboro)  // ERREURS
    {
        // blah blah blah
    }

    Les erreurs sont :
    ||=== Build: Debug in So close ! (compiler: GNU GCC Compiler) ===|
    \main.cpp||In function 'int main()':|
    \main.cpp|5|warning: zero as null pointer constant [-Wzero-as-null-pointer-constant]|
    obj\Debug\Game.o||In function `ZN4GameC2Ea':|
    \Game.cpp|8|undefined reference to `Lang::L_newScore'|
    \Game.cpp|8|undefined reference to `Lang::L_pressSPACE'|
    \Game.cpp|8|undefined reference to `Lang::L_time'|
    \Game.cpp|8|undefined reference to `Lang::L_errors'|
    ||=== Build failed: 4 error(s), 1 warning(s) (0 minute(s), 3 second(s)) ===|

    Je pige pas. Où est le problème ?

    Merci d'avance pour votre aide.
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Tu as déclaré tes chaînes de caractères, mais tu ne les a pas définies

    Il faut mettre quelque part, [dans le fichier cpp par exemple]


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // using sf::String; Maybe
     
    sf::String Lang::L_newScore   = AAA;
    sf::String Lang::L_pressSPACE = BBB;
    sf::String Lang::L_time       = CCC;
    sf::String Lang::L_errors     = DDD;

  3. #3
    Membre habitué
    Avatar de Glân von Brylân
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2014
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2014
    Messages : 133
    Points : 186
    Points
    186
    Par défaut
    J'ai essayé. Mais quand je fais cela, j'ai une erreur de type "multiple definition of...".

    Ou plus exactement :
    ||=== Build: Debug in So close ! (compiler: GNU GCC Compiler) ===|
    obj\Debug\main.o||In function `_gthread_active_p':|
    C:\TDM-GCC-32\lib\gcc\mingw32\4.9.2\include\c++\mingw32\bits\gthr-default.h|302|multiple definition of `Lang::L_newScore'|
    obj\Debug\Game.o:C:\TDM-GCC-32\lib\gcc\mingw32\4.9.2\include\c++\mingw32\bits\gthr-default.h|302|first defined here|

    obj\Debug\main.o||In function `_gthread_active_p':|
    C:\TDM-GCC-32\lib\gcc\mingw32\4.9.2\include\c++\mingw32\bits\gthr-default.h|303|multiple definition of `Lang::L_pressSPACE'|
    obj\Debug\Game.o:C:\TDM-GCC-32\lib\gcc\mingw32\4.9.2\include\c++\mingw32\bits\gthr-default.h|303|first defined here|

    obj\Debug\main.o||In function `_gthread_active_p':|
    C:\TDM-GCC-32\lib\gcc\mingw32\4.9.2\include\c++\mingw32\bits\gthr-default.h|304|multiple definition of `Lang::L_time'|
    obj\Debug\Game.o:C:\TDM-GCC-32\lib\gcc\mingw32\4.9.2\include\c++\mingw32\bits\gthr-default.h|304|first defined here|

    obj\Debug\main.o||In function `ZN9__gnu_cxx13new_allocatorIjEC2ERKS1_':|
    C:\TDM-GCC-32\lib\gcc\mingw32\4.9.2\include\c++\ext\atomicity.h|49|multiple definition of `Lang::L_errors'|
    obj\Debug\Game.o:C:\TDM-GCC-32\lib\gcc\mingw32\4.9.2\include\c++\ext\atomicity.h|49|first defined here|

    ||=== Build failed: 8 error(s), 0 warning(s) (0 minute(s), 3 second(s)) ===|

    Alors cela semble être un problème de compileur, donc voici quelques infos supplémentaires :
    J'utilise GCC 4.9.2 32 bits sur Code::Blocks 13.12, sous Windows 8.1 64 bits.
    Je ne pense pas que c'en soit la cause, mais je note également que j'ai appliqué ce patch pour pouvoir utiliser la fonction std::string::to_string(). Enfin je dis que je ne pense pas, mais en même temps c'est un patch qui touche aux string, donc...

    Merci de votre aide, mais je crains que le problème ne soit plus insidieux qu'une simple erreur de débutant. (sans vouloir paraître condescendant...je vous suis réellement reconnaissant de vouloir m'aider)


    EDIT : Je n'ai pas créé de Lang.cpp, au fait, sinon je l'aurais donné. Peut-être que je devrais, mais je ne vois pas ce que cela change.
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    N'aie pas peur: crée un fichier Lang.cpp et mets-y les définitions

    Qu'est-ce que cela change? Les unités de compilation (un cpp + les includes) parce que tes chaînes se retrouvent dans les unités Game.o et main.o

  5. #5
    Membre habitué
    Avatar de Glân von Brylân
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2014
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2014
    Messages : 133
    Points : 186
    Points
    186
    Par défaut
    Ok.

    *facepalm avec la main gauche*
    *facepalm avec la main droite*

    Quel imbécile. La honte est conséquente.

    Problème résolu, merci beaucoup.
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

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

Discussions similaires

  1. Undefined reference étrange
    Par fred94190 dans le forum Débuter
    Réponses: 17
    Dernier message: 17/05/2013, 17h15
  2. winsock.h : undefined reference...
    Par abraxas dans le forum Dev-C++
    Réponses: 14
    Dernier message: 06/08/2012, 13h42
  3. Compilation de xmms : undefined reference to...
    Par Michaël dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 04/02/2005, 19h05
  4. undefined reference to `xmlParseFile'
    Par Clemaster dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 25/06/2004, 20h38
  5. g++ : undefined reference to ...
    Par le_barbu dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 14/05/2004, 07h23

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