Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur compilation

    16 septembre 2018 à 15:27:00

    Bonjour, je suis étudiant en DUT Informatique, en première année. Je suis donc un débutant. J'ai commencé un travail en classe que j'ai à rendre. Je l'ai donc commencé sur Unix à l'aide du compilateur GCC. J'aimerais bien continuer chez moi sauf que j'utilise Windows avec MinGW. Ainsi en voulant compiler mon programme un message d'erreur apparait : 

    c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libmingw32.a(main.o):(.text.startup+0xa0): undefined reference to `WinMain@16'

    collect2.exe: erreur : ld a retourné 1 code d'état d'exécution

    Et voici mes codes 

    bonjour.c:

    #include <stdio.h>
    #include"bonjour.h"
    
    /*
     * nom : affichBonjour
     * finalité : afficher simplement bonjour
     */
    void affichBonjour(void){
      printf("Bonjour\n");
    }
    
    
    /*
     * nom : affichBonjour1
     * finalité : elle demande l'année en cours puis affiche bonjour pour cette année
     */
    void affichBonjour1(void){
    
      int a ;
      printf("Année en cours: ");
      scanf("%d",&a);
      printf("Bonjour %d", a) ;
      
      
    } 
    void affichBonjour(void);
    void affichBonjour1(void);
    
    #include"bonjour.h"
    
    int main(void){ 
      /* affichBonjour(); */
      affichBonjour1();
      return 0;
    }
    

    Merci d'avance !



    -
    Edité par Ush_63 16 septembre 2018 à 15:28:22

    • Partager sur Facebook
    • Partager sur Twitter
      17 septembre 2018 à 9:43:39

      plusieurs solutions :

      • la VM, inclus par defaut dans w10 sous le nom HyperV
      • l'utilisation d'un IDE
      • je ne suis pas sur de celle-ci mais :
        #include <stdio.h>
        #include <windows.h> // il te manque ça je croix
        
        int main ( void )
        {
            printf ( "hello\n" );
            return ( 0 );
        }
      EDIT : tu peux donner ta ligne de compilation ainsi que le retour console complet ?

      -
      Edité par ox223252 17 septembre 2018 à 9:45:27

      • Partager sur Facebook
      • Partager sur Twitter

      la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

      Mon GitHub

        17 septembre 2018 à 19:07:44

        ox223252 a écrit:

        plusieurs solutions :

        • la VM, inclus par defaut dans w10 sous le nom HyperV
        • l'utilisation d'un IDE
        • je ne suis pas sur de celle-ci mais :
          #include <stdio.h>
          #include <windows.h> // il te manque ça je croix
          
          int main ( void )
          {
              printf ( "hello\n" );
              return ( 0 );
          }
        EDIT : tu peux donner ta ligne de compilation ainsi que le retour console complet ?

        -
        Edité par ox223252 il y a environ 9 heures

        Merci de m'avoir répondu !

        Alors, j'ai essayé de mettre "#include <windows.h>" et ça n'a pas marché. ça m'affiche maintenant une autre erreur. Si les deux premières solutions peuvent m'aider, pourrais-tu s'il te plaît, me donner plus de détails sur ces dernières ?

        Voilà la ligne de compilation et le retour console complet comme tu me l'as demandé :

        C:\Users\Soso\Desktop\Programmation\algo tp1\exo 0>zcc testBonjour.c

        C:\Users\Soso\AppData\Local\Temp\ccY0GqC6.o:testBonjour.c:(.text+0xc): undefined reference to `affichBonjour1'

        collect2.exe: erreur : ld a retourné 1 code d'état d'exécution

        EDIT : Désolé ! Je reviens pour dire que j'ai réussi à contourner le problème en compilant en même tant tous les fichiers de mon dossier en entrant dans le terminale : zcc *.c -o exo0

        C'est déjà très bien. Je peux avancer dans mon travail et faire des essais.

        Je ne peux pas donc pas compiler un fichier à la fois ?

        -
        Edité par Ush_63 17 septembre 2018 à 19:18:28

        • Partager sur Facebook
        • Partager sur Twitter
          17 septembre 2018 à 20:34:53

          Utilisation d'un Makefile, avec dépendances automatiques

          CC = gcc
          
          CFLAGS = -std=c11
          CFLAGS += -Wall -Wextra -pedantic
          CFLAGS += -MMD
          
          
          AfficheBonjour: AfficheBonjour.o bonjour.o
          
          -include *.d



          -
          Edité par michelbillaud 17 septembre 2018 à 20:36:21

          • Partager sur Facebook
          • Partager sur Twitter
            17 septembre 2018 à 21:08:01

            Salut !

            Quand tu a créé ton projet, il ne faut pas créer un win32 projet mais un "console projet" (c'est de la que doit venir ton erreur de winmain16)

            Et tout marchera comme à ta fac, et inutile d'inclure <windows.h>

            Le code que tu as mis est parfaitement portable, sous Windows et Linux, rien a changer :)

            -
            Edité par Fvirtman 17 septembre 2018 à 21:08:48

            • Partager sur Facebook
            • Partager sur Twitter

            Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

              18 septembre 2018 à 7:52:56

              bonjour

              Pour te dire si tu peux compiler un projet  fichier par fichier, mais le faire à la main c'est long et fastidieux, c'est pour ça qu'on utilise make. En gros pour compiler tu dois compiler chaque élément séparément (gcc -c main.o main.c, gcc -c func.o func.c, …) puis faire les lien entre tout ça (gcc -o prog func.o main.o … ).

              Pour simplifier le tout il y à makefile qui automatise tout ça regarde dans ma signature pour un tuto su les makefiles (après je n'ai jamais tenté les makefiles sous Windows).

              EDIT : pour les autres solutions, avec ta VM tu va émuler un environnement (un linux par exemple) et là pas de problème de compatibilité et pour l'IDE, tu peux toujours installer code::blocks par exemple c'est lui qui va gérer toute la compilation, toi tu n'auras qu'a gérer les dépendances.

              -
              Edité par ox223252 18 septembre 2018 à 7:58:05

              • Partager sur Facebook
              • Partager sur Twitter

              la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

              Mon GitHub

                18 septembre 2018 à 9:55:13

                Fvirtman a écrit:

                Salut !

                Quand tu a créé ton projet, il ne faut pas créer un win32 projet mais un "console projet" (c'est de la que doit venir ton erreur de winmain16)

                Et tout marchera comme à ta fac, et inutile d'inclure <windows.h>

                Le code que tu as mis est parfaitement portable, sous Windows et Linux, rien a changer :)

                -
                Edité par Fvirtman il y a environ 12 heures

                Salut !

                Merci beaucoup d'avoir répondu ! J'ai réussi à "résoudre le problème". Enfaite, je pense que l'erreur venait de moi puisque pour compiler, je tapais dans le terminale : zcc NomDuFichier.c alors qu'il fallait mettre zcc *.c -o NomDuProg d'après ma prof. Effectivement, cela a marché. J'aurais aussi voulu savoir comment compiler les fichiers un par un sans que ça plante mais d'après

                ox223252 c'est long et fastidieux. Je vais donc continuer à utiliser ce qui marche :lol:



                ox223252 a écrit:

                bonjour

                Pour te dire si tu peux compiler un projet  fichier par fichier, mais le faire à la main c'est long et fastidieux, c'est pour ça qu'on utilise make. En gros pour compiler tu dois compiler chaque élément séparément (gcc -c main.o main.c, gcc -c func.o func.c, …) puis faire les lien entre tout ça (gcc -o prog func.o main.o … ).

                Pour simplifier le tout il y à makefile qui automatise tout ça regarde dans ma signature pour un tuto su les makefiles (après je n'ai jamais tenté les makefiles sous Windows).

                EDIT : pour les autres solutions, avec ta VM tu va émuler un environnement (un linux par exemple) et là pas de problème de compatibilité et pour l'IDE, tu peux toujours installer code::blocks par exemple c'est lui qui va gérer toute la compilation, toi tu n'auras qu'a gérer les dépendances.

                -
                Edité par ox223252 il y a environ 1 heure


                Salut !

                Ah oui, enfaîte je connaissais déjà la solution de la VM. Mais bon, moi ce que je voulais, c'était le fait de pouvoir compiler sous Windows. Mais c'est bon, je ne rencontre plus de problème, merci à toi en tout cas d'avoir consacré du temps à mon problème ! 



                -
                Edité par Ush_63 18 septembre 2018 à 9:58:51

                • Partager sur Facebook
                • Partager sur Twitter
                  18 septembre 2018 à 12:18:25

                  Pour compiler les fichiers un par un, pour zcc je ne sais pas, mais en général (et pour gcc) on met l'option -c

                  gcc -c entree.c
                  gcc -c plat.c
                  gcc -c dessert.c
                  

                  ce qui produit des fichiers objets (suffixe .o)

                  Pour réunir ces fichiers et les lier à la bibliothèque standard, on fait

                  gcc entree.o plat.o dessert.o  -o repas
                  

                  ce qui fabrique l'exécutable désigné par l'option -o (output) qui, sinon, s'appelle a.out

                  On peut faire "gcc *.o -o repas" si on on est certain qu'il ne traine pas dans le répertoire un fichier .o qui ne devrait pas y être (suite à un renommage des sources, par exemple)

                  Ceci sans parler des autres options indispensables, comme  -std=c11 -Wall -Wextra -pedantic etc.



                  -
                  Edité par michelbillaud 18 septembre 2018 à 12:21:10

                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 septembre 2018 à 14:15:20

                    Si tu es sous Windows, installe Visual C++ (gratuit), tu n'as qu'à glisser tes fichiers .c dans la solution, ça compile tout tout seul, et tu as un débuggueur et un bel environnement, pas de makefile à taper. 

                    Code blocks ou n'importe quel IDE pareil. Je trouve dommage de se passer d'IDE.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                      18 septembre 2018 à 15:46:07

                      C'est dommage pour programmer, mais il y a une phase où il vaut mieux comprendre ce que l'IDE fait pour nous.

                      Cette semaine, j'ai un (*) étudiant de 2ieme année qui, après un an de java, c# et bash a tenté de faire exécuter un programme C en faisant

                      chmod 755 hello.c
                      ./hello.c
                      

                      parce qu'il n'a apparemment jamais compris qu'il fallait, d'une façon ou d'une autre, compiler les programmes sources.

                      Il y a donc un moment où faire les choses "à la main", c'est le moyen d'apprendre des choses qu'il est n'est pas inutile de savoir.

                      (*) Au moins.



                      -
                      Edité par michelbillaud 18 septembre 2018 à 15:47:32

                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 septembre 2018 à 16:38:39

                        michelbillaud a écrit:

                        C'est dommage pour programmer, mais il y a une phase où il vaut mieux comprendre ce que l'IDE fait pour nous.

                        Cette semaine, j'ai un (*) étudiant de 2ieme année qui, après un an de java, c# et bash a tenté de faire exécuter un programme C en faisant

                        chmod 755 hello.c
                        ./hello.c
                        

                        parce qu'il n'a apparemment jamais compris qu'il fallait, d'une façon ou d'une autre, compiler les programmes sources.

                        Il y a donc un moment où faire les choses "à la main", c'est le moyen d'apprendre des choses qu'il est n'est pas inutile de savoir.

                        (*) Au moins.

                        -
                        Edité par michelbillaud il y a environ 1 heure

                        Si seulement tous les profs savaient de quoi ils parlaient, mais certain sont aussi largué que les étudiants :-°

                        Mais il est vrai que beaucoup ne sont pas capable de comprendre comment fonctionne un makefile et encore pire il n'ont même pas conscience de son existence et utilité :colere:.

                        • Partager sur Facebook
                        • Partager sur Twitter

                        la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

                        Mon GitHub

                          18 septembre 2018 à 19:28:00

                          Disons que la, l'auteur fait des makefile a la fac, mais si chez lui il veut tester ses programmes il peut prendre un IDE. Je suis tout a fait d'accord pour apprendre les makefile. C'est important. 

                          Mais moi j'ai eu le problème inverse : je suis arrive dans le monde du travail sans connaître les IDE, ni les debuggueurs intégrés , ni meme pas mal de choses car tous mes profs nous faisaient faire du xemacs + makefile.... Dommage !

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                          Erreur compilation

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown