Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur "undefined reference to"

moduler un programme C

    3 décembre 2022 à 20:12:57

    Bonsoir,

    J'essaie de moduler mon programme pour la première fois en plusieurs fichiers qui contiendra chacun une fonction. J'ai voulu ne serait-ce que compiler le programme ci-dessous et j'ai reçu le message d'erreur suivant :

    main.c:(.text+0x4c): undefined reference to `creation_memo'                                                                            
    collect2.exe: error: ld returned 1 exit status                                                                                                                                      
    [Finished in 0.39s with exit code 1]

    voici mes fichiers

    fichier main.c

    #include "creation_memo.h"
    
    int main(){
    	
    	/* variables */
    	int selection;
    
    	/* --- Menu --- */
    	printf("Que desirez-vous faire?\n0 : Quitter\t1 : Creation memo\nChoix : ");
    	scanf("%d",&selection);
    
    	switch(selection){
    		case 0 : 
    			printf("Au revoir !");
    			break;
    		case 1 :
    			creation_memo();
    			break;
    		default :
    			printf("Erreur de saisie.\n");
    			break;
    	}
    
    	return 0;
    }


    fichier creation_memo.c

    #include "creation_memo.h"
    
    void creation_memo(){
    	printf("*** Creation d'un memo ***\n");
    
    }

    fichier creation_memo.h

    #include <stdio.h>
    
    void creation_memo();




    • Partager sur Facebook
    • Partager sur Twitter
      4 décembre 2022 à 0:01:44

      bonjour,

      le problème ne vient pas du découpage, il vient de ta façon de compiler ton projet. Tu ne nous montre pas comment tu fais …

      • Partager sur Facebook
      • Partager sur Twitter
        4 décembre 2022 à 0:49:56

        White Crow a écrit:

        bonjour,

        le problème ne vient pas du découpage, il vient de ta façon de compiler ton projet. Tu ne nous montre pas comment tu fais …


        Bonsoir,

        Je ne comprends. Pour compiler mon projet, je procède de la même manière que j'ai l'habitude de faire.. Le compilateur que j'ai sur Sublime Text compile bien lorsque je n'ai aucun seul fichier

        • Partager sur Facebook
        • Partager sur Twitter
          4 décembre 2022 à 12:05:53

          Et c'est là qu'il faut lire la doc de ST pour savoir comment le configurer pour qu'il envoie les bonnes commandes à ton compilo pour construire ton projet …

          ST est principalement un éditeur de texte que tu peux utiliser comme un IDE mais il faut le configurer.

          Si tu fais de la compilation séparée tu dois compiler chaque fichier de ton projet, puis les lier pour produire un exécutable. La configuration doit expliciter l'endroit où tu trouves les fichiers dont tu as besoin, comment les compiler et comment tout lier.

          • Partager sur Facebook
          • Partager sur Twitter
            4 décembre 2022 à 12:10:42

            Je ne connais pas Sublime Text. mais quand il y a un seul fichier il le compile, ok. mais quand il y en a un deuxième ou plus, il faut lui préciser l’existence de ces fichiers. Dans les EDI, normalement on crée un projet et on intègre à ce projet tous les fichiers qui en font partie.

            • Partager sur Facebook
            • Partager sur Twitter
            ...
              5 décembre 2022 à 17:35:15

              Vous pensez donc qu'il est préférable que j'utilise un IDE comme Code Blocks ou Eclipse pour m'éviter de perdre du temps sur ça ou vous pensez que ça vaut vraiment le coup que je cherche la solution à ce problème? Je vous avouerai que je préfère la premiere option
              • Partager sur Facebook
              • Partager sur Twitter
                5 décembre 2022 à 17:47:34

                Il serait sans doute préférable, mais ça pourrait être un avis de vieux, que tu commences rapidement à te familiariser avec la ligne de commande. Ensuite tu pourras commencer à utiliser un builder comme GNUMake (par exemple, mais il y en a d'autres). Cela te permettra de familiariser avec le processus qui permet d'aboutir à un exécutable.

                Quoiqu'il en soit, il faudra toujours faire l'effort à un moment donné ou à un autre de lire la doc pour savoir «comment faire» (et du coup c'est plus simple si tu sais déjà comment ça marche à la main (pun intended) ).

                • Partager sur Facebook
                • Partager sur Twitter
                  5 décembre 2022 à 18:16:39

                  > Vous pensez donc qu'il est préférable que j'utilise un IDE comme Code Blocks ou Eclipse pour m'éviter de perdre du temps sur ça ou vous pensez que ça vaut vraiment le coup que je cherche la solution à ce problème? Je vous avouerai que je préfère la premiere option

                  Je crois qu'on pense tous très fort que tu vas perdre un temps monstrueux si tu ne fais pas l'effort de comprendre ce qu'est la compilation séparée (compilation des .c sous forme de .o + édition des liens pour produire l'exécutable) alors que justement tu veux avoir des sources dans plusieurs fichiers.

                  La compilation séparée, c'est pas un problème, c'est une solution à divers problèmes (ne pas recompiler tout un projet quand on a changé une ligne dans un projet de plusieurs dizaines/centaines de milliers de lignes, réemployer des codes communs à plusieurs programmes etc).  Le problème, c'est de vouloir l'employer sans comprendre ce que c'est, et de vouloir "gagner du temps"  à compter sur un fonctionnement magique de l'IDE.

                  Pour make, un début minimaliste:

                  • Dans un fichier nommé Makefile, tu mets les lignes
                  CFLAGS = -Wall -Wextra
                  
                  main: main.o creation_memo.o
                  
                  


                  et ça devrait suffire pour qu'en tapant

                  make
                  

                  dans la console, ça recompile ton projet. Ca te montrera au passages les commandes de compilation qui sont lancées.

                  C'EST DE LA MAGIE !

                  • Bon, c'est pas parfait, parce qu'il faut recompiler les .c (et refaire l'édition des liens) si le fichier creation_memo.h est modifié, donc plus complet
                  CFLAGS = -Wall -Wextra
                  
                  main: main.o creation_memo.o
                  
                  # dépendances supplémentaires
                  
                  main.o: creation_memo.h
                  creation_memo.o: creation_memo.h

                   Avec un IDE, il faudra sans doute lui dire "hé, pour l'exécutable main, ça contient le code issu de main.c et de création_compte.c". Les incantations magiques dépendront de l'IDE. Peut-être des cases à cocher.

                  Bref: apprendre à se servir des outils (et lire leur doc, par exemple), ça fait jamais perdre de temps. Au contraire...

                  -
                  Edité par michelbillaud 3 février 2023 à 19:13:07

                  • Partager sur Facebook
                  • Partager sur Twitter
                    3 février 2023 à 17:17:12

                    salut, j'ai les mêmes symptomes ( "undefined reference to ...etc) mais sous linux avec gcc

                    un conseil?

                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 février 2023 à 18:31:38

                      PatLombard a écrit:

                      salut, j'ai les mêmes symptomes ( "undefined reference to ...etc) mais sous linux avec gcc

                      un conseil?


                      Nous envoyer une boule de cristal, ou a défaut

                      • les sources  parce qu'il faut savoir qui utilise quoi, et quoi est défini où.
                      • le Makefile
                      • une trace de l'exécution de la compilation pour voir les commandes qui ont été exécutées.
                      On ne résoud pas les problèmes par inspiration divine. On examine les symptomes, et pour ça, il faut les voir.  Après, on essaiera de comprendre pourquoi, et encore après, de corriger.
                      Autre conseil ;
                      • lire ce qui a déjà été écrit sur ce sujet
                      • comprendre
                      • appliquer

                      -
                      Edité par michelbillaud 3 février 2023 à 18:36:53

                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 février 2023 à 16:01:06

                        ok, j'ai lu et vaincu le problème!

                        (linux, gcc)

                        merci de m'avoir remis les idées en place

                        à ma décharge, j'avais voulu refaire les exemples mis dans le cours "langage C" (main, aire.c aire.h): chapitre programmation modulaire, nulle part n'est mentionné le fait qu'il faudra lier les fichiers. c en créant un makefile...

                        • Partager sur Facebook
                        • Partager sur Twitter
                          5 février 2023 à 16:28:30

                          Le cours suppose, sans trop le dire, que l'utilisateur emploie CodeBlocks, et qu'il s'y prend correctement quand il s'agit d'ajouter un nouveau fichier dans le projet.

                          "Correctement" = de la façon qui fait que CodeBlocks ajoute automatiquement le nouveau.c dans la liste des trucs à compiler pour fabriquer l'exécutable du projet.  Si on relit les forums, on voit bien que les utilisateurs s'ingénient - chose parfaitement prévisible - à trouver des moyens de s'y prendre autrement, et pleurer ensuite misère parce que l'ordinateur il veut pas. Et ça ne leur donne aucun indice sur ce qui se passe concrètement quand on fait de la compilation séparée : c'est censé marcher par magie. Déjà, si ils n'utilisent pas CodeBlocks...

                          Un des nombreux défauts de ce cours, qui en plus baptise programmation modulaire (une approche de conception du logiciel) ce qui n'est que de la compilation séparée (une technique pour étaler le code source sur plusieurs fichiers).

                          Mais le plus gros défaut, c'est que l'auteur du cours ne fait absolument rien pour corriger les problèmes.

                          -
                          Edité par michelbillaud 5 février 2023 à 17:09:07

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Erreur "undefined reference to"

                          × 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