Partage
  • Partager sur Facebook
  • Partager sur Twitter

Variable "non-définie" en suivant le cours sur C

undefined reference to...collect2.exe error ld returned 1 exit status

    15 avril 2023 à 19:42:41

    Bonjour, 

    Je suis le cours sur le C, et jusque là j'ai pas été confronté à un truc que j'arrive pas à régler ni en réfléchissant, ni en cherchant sur internet.

    Donc je vous explique, j'en suis à la partie "Programmation modulaire". Mon soucis est qu'en suivant les instructions du cours je reste bloqué sur la notion d'inclure un fichier.h et un fichier.c afin de m'en servir dans un troisième fichier main.c

    De ce que j'ai cru comprendre dans les logs d'erreur c'est que ma variable aireRectangle est non-définie. Or c'est carrément le but de cette partie du cours.

    #ifndef aire_h
    #define aire_h
    
    #include <stdio.h>
    
    double aireRectangle(double largeur, double hauteur);
    
    #endif /* aire_h */
    #include "aire.h"
    
    double aireRectangle(double largeur, double hauteur)
    {
        return largeur * hauteur;
    }
     
    #include <stdio.h>
    #include "aire.h"
    
    int main(int argc, const char *argv[]){
        double resultat;
        resultat = aireRectangle(10.0, 20.0);
    
        printf("L'aire du rectangle est %f\n", resultat);
        return 0;
    }
    

    En espérant que vous pourrez m'éclairer !

    Merci d'avance !
    PS : Pour vous partager mon code j'ai dû mettre que c'était du C++ car il n'y avait que ça et C#, pas de C sauf erreur de ma part.

    -
    Edité par Tulece 15 avril 2023 à 20:18:22

    • Partager sur Facebook
    • Partager sur Twitter
      15 avril 2023 à 20:03:59

      Bonsoir, Évitez les titres de sujet avec "problème", si vous postez on se doute que vous avez un problème l'indiquer dans le titre n'apporte aucune information supplémentaire quant au contenu du sujet.

      Le message qui suit est une réponse automatique activée par un membre de l'équipe de modération. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
      Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

      Pour plus d'informations, nous vous invitons à lire les règles générales du forum

      Merci de colorer votre code à l'aide du bouton Code

      Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: cpp;">Votre code ici</pre>.

      Merci de modifier votre message d'origine en fonction.

      Mauvais titre

      Le titre est un élément important qui ne doit pas être négligé. N'oubliez pas cette règle simple : le titre idéal résume la question que vous allez poser en une petite phrase. Il doit permettre aux visiteurs de se repérer facilement dans le forum visité et d'identifier le sujet à sa seule lecture.

      Vous pouvez utiliser divers préfixes comme [Erreur], [MySQL], [Compatibilité], etc... Aussi, pensez à consulter les règles propres à chaque forum (visibles dans les topics épinglés en haut des sections).

      De plus, choisir un bon titre permet de rendre plus faciles les recherches des autres membres.

      Les titres de type "besoin d'aide" ou "problème" ne sont pas tolérés.

      Merci de modifier votre titre. Pour cela, éditez le premier message de votre sujet.

      (titre originel : Problème avec une partie du cours sur le C)

      Liens conseillés

      -
      Edité par AbcAbc6 15 avril 2023 à 20:05:04

      • Partager sur Facebook
      • Partager sur Twitter
        15 avril 2023 à 20:34:59

        Hello,

        Ton problème est simple: le linker (ld - l'éditeur de lien) ne trouve pas le code compilé de aire.c: (bien que le  message que tu donnes ne soit pas complet)

        undefined reference to...collect2.exe error ld returned 1 exit status

        Tu dois ajouter aire.c dans ton projet, pour qu'il soit compilé, et lié avec le code code compilé de ton main. Mettre le .h ne suffit pas.

        -
        Edité par edgarjacobs 15 avril 2023 à 20:39:54

        • Partager sur Facebook
        • Partager sur Twitter

        On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

          15 avril 2023 à 20:40:43

          aireRectangle n'est pas défini car tu n'as pas lié le fichier objet issus de la compilation du fichier source qui contient sa définition. Peut-être n'as tu même pas compilé ce fichier. La façon de procéder dépend des outils que tu utilises.

          La production d'un exécutable passe par plusieurs phases, dont la compilation (les fichiers source .c sont compilés et produisent les fichiers objets .o ou .obj) ensuite le linker fait l'édition des liens en assemblant tout les fichiers objets pour produire l'exécutable.

          • Partager sur Facebook
          • Partager sur Twitter
          ...
            15 avril 2023 à 22:59:06

            Merci beaucoup pour la réactivité ! 

            J'utilise VSCode du coup, et je vais pas vous mentir je galère à trouver une solution alors que beaucoup de gens en ont déjà parlé sur les forums... 

            J'arrive pas à m'en sortir vous avez des pistes s'il vous plaît ? 

            • Partager sur Facebook
            • Partager sur Twitter
              16 avril 2023 à 9:13:56

              > des pistes 

              Comme indiqué plus haut, ajouter aire.c dans le projet (Il ne suffit pas qu'il soit dans le répertoire/dossier).

              Et la manière de faire dépend de ce qui est utilisé pour matérialiser  la notion de projet : cmakefile, makefile,...

              Le but c'est que main.c et aire.c soient compilés, et que les deux fichiers objets résultants soient combinés pour construire l'exécutable.

              Sinon, le linker ld (qui est chargé de cette opération) ne trouve pas la définition du symbole aireRectangle mentionné par main.o. D'où protestations.

              Au passage, c'est une fonction, pas une variable.

              ×××

              Un début de solution un peu sauvage est de mettre la ligne

              main: main.o aire.o

              Dans un fichier nommé makefile, et de taper make.

              ×××

              Mieux

              CFLAGS += -MMD
              main: main.o aire.o
              
              -include *.d

              Qui prend en compte automatiquement  les inclusions d’entête dans les dépendances. Mais là je parle peut-être chinois.

              xxx

              Le point de départ, ça serait de regarder ce que vscode utilise par défaut chez vous, pour implémenter la notion de projet (ça dépend des plugins installés je crois).

              -
              Edité par michelbillaud 16 avril 2023 à 12:53:15

              • Partager sur Facebook
              • Partager sur Twitter
                16 avril 2023 à 12:54:53

                Bonjour !

                Je crois que je comprends pas le concept de projet sur VSCode. Maintenant je sais différencier répertoire / dossier et projet.

                J'avoue ne toujours pas réussir à construire un "projet" du coup. Je dispose de CMake et CMake Tools, les extensions C/C++ et CodeRunner. 

                Je suis littéralement un bleu, quelqu'un peut m'aiguiller pour que je reprenne mon cours dans les bonnes conditions s'il vous plaît ?

                • Partager sur Facebook
                • Partager sur Twitter
                  16 avril 2023 à 13:47:20

                  Nativement, VSCode n'a pas de système de build pour le C ou le C++.

                  CodeRunner est une extension qui compile et link juste le fichier courant, autant dire que ça ne sert très vite à rien en C et C++.

                  CMake Tools est une extension qui te permet de facilement compiler ton projet dans VSCode sous peu qu'il y ait un CMakeLists.txt à la racine du projet (il faut aussi que CMake soit installé évidemment).

                  Pour ton exo, le CMakeLists.txt se résumerait à ceci (en supposant que main.c et aire.c sont aussi à la racine du projet):

                  cmake_minimum_required(VERSION 3.15)
                  project(learn_c LANGUAGES C)
                  
                  add_executable(aire_rectangle main.c aire.c)


                  Une structure un peu plus viable dans le cadre de ton apprentissage serait d'avoir un sous-répertoire par exercice:

                  learn_C/
                  ├─ exo1/
                  │  ├─ aire.c
                  │  ├─ aire.h
                  │  ├─ main.c
                  ├─ exo2/
                  │  ├─ file1.c
                  │  ├─ file1.h
                  │  ├─ file2.c
                  │  ├─ file2.h
                  │  ├─ main.c
                  ├─ CMakeLists.txt

                  CMakeLists

                  cmake_minimum_required(VERSION 3.15)
                  project(learn_C LANGUAGES C)
                  
                  add_executable(exo1 exo1/main.c exo1/aire.c)
                  add_executable(exo2 exo2/main.c exo2/file1.c exo2/file2.c)

                  -
                  Edité par SpaceIn 16 avril 2023 à 14:02:33

                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 avril 2023 à 14:38:14

                    Nickel je vais me réorganiser, deux autres petites questions : j'ai un dossier .vscode avec un tasks.json à l'intérieur. Est-ce que je dois le garder, le déplacer ou je peux le supprimer ?

                    Et enfin, est-ce qu'il y a des cours sur OpenClassroom qui permettent de mieux comprendre ce sujet (je ne vois même pas quel nom ça pourrait avoir) ? 

                    Merci !

                    {
                        "tasks": [
                            {
                                "type": "cppbuild",
                                "label": "C/C++: gcc.exe build active file",
                                "command": "D:\\Antoine\\Téléchargements\\MinGW\\bin\\gcc.exe",
                                "args": [
                                    "-fdiagnostics-color=always",
                                    "-g",
                                    "${file}",
                                    "-o",
                                    "${fileDirname}\\${fileBasenameNoExtension}.exe"
                                ],
                                "options": {
                                    "cwd": "${fileDirname}"
                                },
                                "problemMatcher": [
                                    "$gcc"
                                ],
                                "group": {
                                    "kind": "build",
                                    "isDefault": true
                                },
                                "detail": "Task generated by Debugger."
                            }
                        ],
                        "version": "2.0.0"
                    }

                    -
                    Edité par Tulece 16 avril 2023 à 14:43:30

                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 avril 2023 à 14:46:59

                      Tu peux virer ce tasks.json si tu bascules sur un système de build comme CMake.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 avril 2023 à 14:55:37

                        Nickel, mais donc si je comprends bien à chaque nouveau projet je devrai recréer un fichier CMakeList.txt ou alors je devrai ajouter à l'intérieur de celui déjà existant add_executable(le projet en question) ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 avril 2023 à 15:04:15

                          Qu'appelles tu "nouveau projet" dans le cadre de ton cours? Pour moi tous les exos que tu vas faire dans le cadre du cours sont dans le même projet, et tu vas avoir autant de add_executable() (qui comme son nom l'indique représente un executable compilé à partir des fichiers que tu lui indiqueras) que d'exercices.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            16 avril 2023 à 15:29:03

                            Alors du coup oui j'ai tout réorganisé, effectivement c'est plus logique de considérer le cours en entier comme un projet et non chaque exo un projet.

                            Du coup voilà le screen de ce que j'ai pu faire, et voici un screen du CMakeList.txt que j'ai rédigé. Je n'ai pas encore rempli les autres exos mais si on se focalise sur l'exo6, comment faire pour lancer la compilation de tout le programme ? 

                            cmake_minimum_required(VERSION 3.15)
                            project(learn_C LANGUAGES C)
                            
                            add_executable(exo1)
                            add_executable(exo2)
                            add_executable(exo3)
                            add_executable(exo4)
                            add_executable(exo5)
                            add_executable(exo6 exo6/main.c exo6 aire.c)
                            



                            -
                            Edité par Tulece 16 avril 2023 à 16:55:50

                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 avril 2023 à 19:29:20

                              Et bien tu actives l'extension CMake Tools, et tu l'utilises comme décrit à partir d'ici: https://code.visualstudio.com/docs/cpp/CMake-linux#_select-a-kit

                              C'est du clicodrôme à ce stade.

                              Evite les add_executable() sans fichier source associé, il ne va pas aimer je pense. Et tu as une coquille dans ton dernier add_executable(), tu n'as correctement écrit exo6/aire.c

                              • Partager sur Facebook
                              • Partager sur Twitter
                                16 avril 2023 à 19:40:35

                                Alors du coup j'ai essayé de me servir de CMake car dans le terminal la commande cmake --version ne renvoyait vers rien. Maintenant la commande cmake --version fonctionne mais dès que je veux configurer quoi que ce soit avec Ctrl Shift P > CMake Configure ça me balance l'erreur "Bad CMake executable: "D:\Antoine\cmake-3.26.3-windows-x86_64\bin". Check to make sure it is installed or the value of the "cmake.cmakePath" setting contains the correct path" 

                                J'ai crée un nouveau path dans les variables d'environnement, j'ai copié le même path dans les paramètres de VSCode et je reste bloqué.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  16 avril 2023 à 20:33:30

                                  Je ne sais pas ce que tu as fait exactement, tu as touché à cmake.cmakePath? Le chemin indiqué est étrange. cmake.cmakePath attend le chemin complet vers l'exécutable cmake.exe, pas vers le répertoire où se trouve cet exécutable.

                                  Ensuite le screenshot de ton explorateur dans le message précédent est louche, tu ne devrais pas avoir ce "Sans Titre > VS Code", il faut ouvrir son projet à la racine.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    16 avril 2023 à 20:36:48

                                    Alors du coup oui j'ai touché le path j'ai bloqué dessus depuis ce matin. J'ai installé via MSYS2 cmake(comme j'avais fait pour installer GCC) avant ça je l'avais dl en extension et le logiciel en lui-même sur internet. Je vois pas comment "ouvrir mon projet à la racine", j'ai réorganisé mes dossier en learn_c puis à l'intérieur exo 1... jusqu'à 6, Mais j'ai pas fait grand chose non plus. J'ai l'impression d'être coincé dans un bourbier.

                                    -
                                    Edité par Tulece 16 avril 2023 à 21:16:52

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      16 avril 2023 à 21:16:13

                                      Tu es sûr d'avoir lu mon message? Je t'ai dit de remplacer la valeur de cmake.cmakePath par le chemin de l'exécutable (c'est à dire D:\Antoine\MSYS2\mingw64\bin\cmake.exe).

                                      Et pour ouvrir ton projet à la racine, je vois pas trop ce que tu comprends pas. Dans VSCode Fichier > Ouvrir le dossier > tu sélectionnes le répertoire learn_c

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        16 avril 2023 à 22:01:50

                                        J'ai clairement perdu en concentration en bloquant là dessus désolé, merci pour ta patience et ta pédagogie ! 

                                        J'en reviens au sujet premier de ce topic : j'ai donc pu build le projet, maintenant je sais pas comment compiler tout ça, ni si mon CMakeLists est ok (je ne crois pas). Je suis totalement débutant je galère déjà avec les termes basiques donc je me perds très vite.  

                                        -
                                        Edité par Tulece 16 avril 2023 à 22:02:23

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          16 avril 2023 à 22:09:15

                                          Tulece : est-ce que tu utilises VSCode parce que c'est un outil que tu apprécies, ou bien parce que le cours est illustré avec VSCode ?

                                          Si c'est la deuxième réponse, sache que tu n'es pas obligé d'utiliser VSCode pour suivre le cours. Utiliser un autre IDE ou aucun IDE ne change strictement rien à l'apprentissage. Je sais, j'ai suivi le cours vers 2010 : à l'époque c'est Code::Blocks qui était mis en avant, mais ça m'a vite gonflé d'utiliser un IDE (je voulais apprendre la programmation en C, pas Code::Blocks) et j'ai suivi tout le cours sans IDE (en compilant dans la fenêtre de commande). Tu peux faire pareil afin de te concentrer sur la programmation en C au lieu de t'arracher les cheveux à essayer de paramétrer ce truc.

                                          (Mais si tu as choisi VSCode par choix personnel, oublie tout ce que j'ai écrit.)

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            16 avril 2023 à 23:53:09

                                            Bonjour robun ! Ça peut paraître étonnant mais j'apprécie VSCode, le côté modulaire me plaît mais c'est vrai que je m'y suis littéralement perdu. J'hésite simplement à passer sur VSCommunity qui de ce que j'ai compris se rapproche plus de Code::Blocks vu que c'est un IDE. 

                                            Mais je pense qu'à force de persuasion et de tentatives je m'en sortirai ! Je compte pas lâcher mes efforts. Merci pour la question cependant ! 

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              17 avril 2023 à 0:11:21

                                              Je vois dans ton screenshot que tu as obtenu un exo6.exe dans le répertoire de build, donc la compilation et l'édition des liens ont bien fonctionné, je vois pas trop ce que tu attends de plus.

                                              Le build par CMake c'est:

                                              - une première étape de configuration, et la génération du fichier de build spécifique au générateur choisi par CMake (un fichier Ninja ici en l'occurrence).

                                              - le build en lui même à partir du fichier généré au step précédent: la compilation de main.c et aire.c, puis édition des liens pour créer exo6.exe

                                              J'explique, mais tu n'as pas forcément besoin de connaitre ces détails à ton niveau.

                                              Du coup qu'est ce qui te turlupine maintenant?

                                              (Et oui ton CMakeLists est correct)

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                17 avril 2023 à 0:38:45

                                                Ce qui me dérange c'est que depuis que j'ai commencé ce cours quand je compilais mon programme j'avais le résultat qui s'affichait. Là nickel j'ai mon projet, mais je sais pas comment lancer toute la partie exo 6 (donc aire.c, aire.h et main.c) afin d'effectuer le calcul.

                                                Je sais même pas si j'attends quelque chose qui n'est pas supposé arriver, aucune idée. Déjà j'ai tous ces nouveaux fichiers / dossiers depuis que j'ai réussi le build à regarder pour comprendre.

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  17 avril 2023 à 0:44:34

                                                  Maintenant tu veux lancer le programme que tu as compilé, ce n'est plus vraiment le job du build system là. Sache que CMake Tools ajoute un certain nombre de boutons dans la taskbar en bas de VSCode. Un de ces petits boutons est un triangle (typique pour représenter "run" ou "execute") et il te permet de sélectionner l'exécutable puis de le lancer. Il est même assez intelligent pour re-compiler l'exécutable avant si tu as modifié les fichiers sources. Juste à gauche de ce bouton, tu as un autre bouton pour lancer l'exécutable avec le debugger si nécessaire.
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    17 avril 2023 à 4:06:05

                                                    Comme robun, je n'ai pas de IDE.
                                                    C'est si simple de faire en ligne de commande:
                                                    gcc -o prog main.c aire.c -Wall -Wextra ...
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

                                                    Le Tout est souvent plus grand que la somme de ses parties.

                                                      17 avril 2023 à 9:30:31

                                                       SpaceIn : J'avais pas vu qu'il y avait de nouvelles options dans la barre bleue merci ! Je retourne sur mon cours de C gonflé à bloc !

                                                      PierrotLeFou : Je savais utiliser gcc mon soucis c'était en gros d'abord de build un projet (en tant que tel), puis l'installation de CMake avec laquelle j'ai eu quelques bricoles gérées grâce aux gens qui m'ont aidé au-dessus !

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter

                                                      Variable "non-définie" en suivant le cours sur C

                                                      × 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