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.
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 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)
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
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
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.
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
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:
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) ?
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) ?
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.
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)
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
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é.
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.
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.
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
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.
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.)
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 !
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.
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.
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.
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 !
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.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.