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 dans la compilation d'un programme


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2008
    Messages : 69
    Points : 44
    Points
    44
    Par défaut erreur dans la compilation d'un programme
    Bonjour,

    J'ai voulu compiler un programme qui est paru dans une vielle revue: Login Pratique HS n°1 dont voici en piece jointe le code.
    J'ai creer le Makefile car il n'y en avait pas, il est present dans la piece jointe.

    voici l'erreur de compilation:
    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
     
    g++ -Wall -c message.cc
    message.cc: In member function ‘virtual void MessageBox::Rafraichir()’:
    message.cc:156:76: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
      XSetForeground(f->display, f->contexte_graphique, f->ChargeCouleur("white"));
                                                                                ^
    g++ bouton.o fenetre.o message.o -o badgfx -lm -lX11 -L/usr/X11/lib
    /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o*: Dans la fonction «*_start*»*:
    (.text+0x20)*: référence indéfinie vers «*main*»
    bouton.o*: Dans la fonction «*Bouton::Bouton(Fenetre*, Coord*, char*, int)*»*:
    bouton.cc:(.text+0x4c)*: référence indéfinie vers «*func*»
    bouton.cc:(.text+0x6f)*: référence indéfinie vers «*func*»
    bouton.cc:(.text+0x76)*: référence indéfinie vers «*func*»
    bouton.cc:(.text+0x7c)*: référence indéfinie vers «*func*»
    bouton.cc:(.text+0x128)*: référence indéfinie vers «*func*»
    bouton.o:bouton.cc:(.text+0x190)*: encore plus de références indéfinies suivent vers «*func*»
    collect2: error: ld returned 1 exit status
    Makefile:8: recipe for target 'badgfx' failed
    make: *** [badgfx] Error 1
    Merci de votre aide
    Fichiers attachés Fichiers attachés

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

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

    Informations forums :
    Inscription : février 2005
    Messages : 4 851
    Points : 11 611
    Points
    11 611
    Par défaut
    C'est du code précambrien, c'est plus du "C with class" que du C++, et encore moins du C++ moderne.

    Votre compilateur est récent et est bien plus strict que les compilateurs de cette époque reculée.

    Votre compilateur est assez à cheval sur la "const-correctness" pour ne pas confondre un "char *" et une chaine de caractère constante.

    Mais c'est l'ensemble du code qu'il faut complètement revoir pour ne plus avoir le moindre pointeur nu dont ce code est plus que truffé, il y en a partout.

    En C++ moderne, l'usage de pointeurs nus est EXCEPTIONNEL.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    mars 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2008
    Messages : 29
    Points : 113
    Points
    113
    Par défaut
    Dans la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XSetForeground(f->display, f->contexte_graphique, f->ChargeCouleur("white"));
    la chaine de caractères est considéré comme un const char * de la part du compilateur.
    Or, la fonction ChargeCouleur de la classe Fenetre demande un char * (car derrière dans l’implémentation il utilise une fonction de la librairie X11 qui demande aussi un char * : il appelle XParseColor(...) ).
    Donc le compilateur ne veut pas continuer car il ne peut pas faire la conversion const char * vers char * sinon il perd la const-correctness. Il se peut que d’anciennes version du compilateur ne fassent pas cette vérification ou renvoie un char * pour ne chaine de compilateur.

    Et c'est là où rentre en compte le const_cast<>() : c'est justement dans ces cas où on a une API qui n'est pas bien qualifiée avec const. Effectivement, tu ne vas pas pouvoir modifier la librairie X11 pour satisfaire la compilation de ton programme, vu que tu dois la prendre telle quelle.

    Dans ton cas, je te conseil de corriger la const-correctness dans ton programme et d'appliquer un const_cast<>() uniquement aux moments où tu fais appelle à des librairies externes sur lesquelles tu n'as pas la main dessus.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2008
    Messages : 69
    Points : 44
    Points
    44
    Par défaut
    J'avais oublié un fichier listing.cc
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    #define MAIN
    #include "badgfx.hpp"
     
    // On déclare la fenêtre en premier
    Fenetre	Fen1;
     
    void HelloWorld(Composant *B);
    void FermerApp(Composant *B);
     
    int main(void)
    {
      // Cette structure est utilisée pour indiquer la position du bouton
      Coord	position;
      position.x = 20;
      position.y = 20;
     
      // On crée le bouton intitulé "Cliquez ici"
      // Il référence la fenêtre créée auparavant
      Bouton ACliquer(&Fen1, &position, "Cliquez içi", NORMAL);
     
      // On enregistre le composant auprès de la fenêtre
      Fen1.AjouteComposant((void *) &ACliquer);
     
      // On définit l'action du bouton
      ACliquer.ChgAction(HelloWorld);
     
      // On crée un bouton pour quitter l'application
      position.x = 20;
      position.y = 45;
      Bouton Quitter(&Fen1, &position, "Quitter", NORMAL);
     
      // On l'enregistre auprès de la fenêtre
      Fen1.AjouteComposant((void *) &Quitter);
     
      // Et on définit son action (on aurait pu le faire avant,
      // cela n'a pas d'importance)
      Quitter.ChgAction(FermerApp);
     
      // il n'y a plus qu'à afficher le tout
      Fen1.MainLoop();
     
      // Pour la sortie
      return 1;
    }
     
    void HelloWorld(Composant *B)
    {
      printf("Hello world !\n");
    }
     
    void FermerApp(Composant *B)
    {
      Fen1.FinLoop();
    }
    malgre ceci apres un make:
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    g++ -Wall -c bouton.cc
    bouton.cc: In member function ‘void Bouton::Dessine_Bouton()’:
    bouton.cc:61:77: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
       XSetForeground(f->display, f->contexte_graphique, f->ChargeCouleur("white"));
                                                                                 ^
    bouton.cc:68:77: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
       XSetForeground(f->display, f->contexte_graphique, f->ChargeCouleur("black"));
                                                                                 ^
    bouton.cc:88:81: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
       XSetForeground(f->display, f->contexte_graphique, f->ChargeCouleur("black"));
                                                                                 ^
    bouton.cc:95:77: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
       XSetForeground(f->display, f->contexte_graphique, f->ChargeCouleur("white"));
                                                                                 ^
    bouton.cc: In member function ‘void Bouton::Dessine_InvertBouton()’:
    bouton.cc:152:76: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
      XSetForeground(f->display, f->contexte_graphique, f->ChargeCouleur("white"));
                                                                                ^
    bouton.cc:159:76: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
      XSetForeground(f->display, f->contexte_graphique, f->ChargeCouleur("black"));
                                                                                ^
    bouton.cc: In member function ‘int Bouton::ChgTexte(char*)’:
    bouton.cc:311:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
      if (strlen(txt) * 10 <= b_width)
          ~~~~~~~~~~~~~~~~~^~~~~~~~~~
    g++ -Wall -c fenetre.cc
    fenetre.cc: In member function ‘int Fenetre::OuvreFenetre()’:
    fenetre.cc:87:33: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
      arr_plan = ChargeCouleur("grey");
                                     ^
    g++ -Wall -c message.cc
    message.cc: In member function ‘virtual void MessageBox::Rafraichir()’:
    message.cc:156:76: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
      XSetForeground(f->display, f->contexte_graphique, f->ChargeCouleur("white"));
                                                                                ^
    g++ -Wall -c listing2.cc
    listing2.cc: In function ‘int main()’:
    listing2.cc:19:58: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
       Bouton ACliquer(&Fen1, &position, "Cliquez i�i", NORMAL);
                                                              ^
    listing2.cc:30:53: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
       Bouton Quitter(&Fen1, &position, "Quitter", NORMAL);
                                                         ^
    g++ bouton.o fenetre.o message.o listing2.o -o badgfx -lm -lX11 -L/usr/X11/lib
    le programme compile et je peux le lancer.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    mars 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2008
    Messages : 29
    Points : 113
    Points
    113
    Par défaut
    Effectivement, j'avais lu ton message d'erreur un peu trop vite.

    Les warnings sont effectivement générés par ce que j'ai écrit dans mon post.

    Mais l'erreur était une erreur de linkage qui n'arrivait pas à trouver la fonction main, ce qui est normal car elle est présente dans le fichier que tu as rajouté.

    Donc ton programme devrait fonctionner

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

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

    Informations forums :
    Inscription : février 2005
    Messages : 4 851
    Points : 11 611
    Points
    11 611
    Par défaut
    Même erreur que @DarkinGoD, mais un warning, c'est aussi fait pour être corrigé.

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

Discussions similaires

  1. Erreur pour dans la compilation d'un programme avec WINAPI
    Par Detenu-1_0-J_6_4 dans le forum C++
    Réponses: 5
    Dernier message: 11/08/2017, 11h51
  2. Réponses: 5
    Dernier message: 10/06/2009, 20h47
  3. Directshow & Visual Studio 8 : erreur dans la compilation
    Par L'elfe d'Azur dans le forum Windows
    Réponses: 5
    Dernier message: 03/10/2007, 14h21
  4. Erreur dans la compilation à résoudre
    Par nadjib2007 dans le forum C++
    Réponses: 5
    Dernier message: 29/07/2007, 01h03
  5. Erreur dans la Compilation ?
    Par Sceener dans le forum C++
    Réponses: 6
    Dernier message: 05/07/2007, 11h54

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