Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème avec l'utilisation de plusieurs fichiers

cours c++ : partie "découper votre programme en fonctions"

9 février 2020 à 2:47:35

Bonjour à toutes et à tous, 

j'ai un petit problème lorsque je veux utiliser un programme qui est dans un autre fichier source. J'ai repris le même exemple que dans le cours : https://openclassrooms.com/fr/courses/1894236-programmez-avec-le-langage-c/1895985-decoupez-votre-programme-en-fonctions ; je précise que j'utilise visual studio code et je suis sur mac. Voici l'erreur qui s'affiche dans mon terminal :

Undefined symbols for architecture x86_64:

  "ajouteDeux(int)", referenced from:

      _main in main-9a0bc9.o

ld: symbol(s) not found for architecture x86_64

clang: error: linker command failed with exit code 1 (use -v to see invocation)

Merci d'avance pour votre aide, 

Yazid 

  • Partager sur Facebook
  • Partager sur Twitter
9 février 2020 à 6:41:30

Quels sont les fichiers. Dans quel fichier est définie la fonction manquante. Quelles sont les commandes de compilation utilisées.

-
Edité par michelbillaud 9 février 2020 à 6:42:39

  • Partager sur Facebook
  • Partager sur Twitter
11 février 2020 à 14:47:48

Il y a 3 fichiers : main.cpp ; math.cpp ; math.h ;

Dans main.cpp : 

#include<iostream>
#include"math.h"
using namespace std;

int main()
{
int a = 2;
int b = 2;
cout << "Valeur de a : " << a << endl;
cout << "Valeur de b : " << b << endl;
b = ajouteDeux(a); //Appel de la fonction
cout << "Valeur de a : " << a << endl;
cout << "Valeur de b : " << b << endl;

return 0;
}
Dans math.cpp : 
#include"math.h"

int ajouteDeux(int nombreRecu)
{
int valeur = nombreRecu + 2;

return valeur;
}

int main()
{

}
Dans math.h : 
#ifndef MATH_H_INCLUDED
#define MATH_H_INCLUDED
int ajouteDeux(int nombreRecu);

#endif // MATH_H_INCLUDED
  • Partager sur Facebook
  • Partager sur Twitter
11 février 2020 à 15:54:05

Je vois deux fonctions main.

-
Edité par michelbillaud 11 février 2020 à 15:54:52

  • Partager sur Facebook
  • Partager sur Twitter
11 février 2020 à 17:02:41

il y a 2 fonctions "main" mais dans 2 fichiers différents (main.cpp et math.cpp) car dans math.cpp si je ne mets pas "int main() {}" l'éditeur me dit qu'il y a une erreur :

Undefined symbols for architecture x86_64:

  "_main", referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
  • Partager sur Facebook
  • Partager sur Twitter
11 février 2020 à 17:11:21

Et avoir besoin de deux main, tu trouves ça normal toi....

C'est signe que c'est parti en n'importe quoi. Jette ce projet à la poubelle, et repars de zero calmement, dans un nouveau répertoire.

-
Edité par michelbillaud 11 février 2020 à 17:15:05

  • Partager sur Facebook
  • Partager sur Twitter
11 février 2020 à 18:09:04

C'est le projet du cours ... j'ai juste fait un copier/coller pour avoir un exemple. Si tu penses que c'est n'importe va te plaindre au professeur i.e : le créateur d'openclassrooms.
  • Partager sur Facebook
  • Partager sur Twitter
11 février 2020 à 18:25:10

Il se trouve que tu as copié de travers (ou dans un répertoire où il y a des trucs), mais bon, si tu as décidé que c'est de la faute au prof, très bien.

Le cours c'est aussi du n'importe quoi, mais bon, ce qu'on t'en dit, c'est pour t'aider.

  • Partager sur Facebook
  • Partager sur Twitter
11 février 2020 à 18:26:35

Donc créateur du cours de C++ le plus détestable de la francophonie, alors ?

Pour faire simple, démerdes toi pour qu'il n'y ai qu'une seule et une seule fonction "main" dans l'ensemble des fichiers .cpp qui serviront comme sources (et les définitions de toutes les fonctions libres ne doivent apparaitre qu'une fois dans l'ensemble des sources, aussi).

Fait en sorte d'avoir la définition de toutes les fonctions que tu utilises, directement ou indirectement depuis la fonction main, dans un des fichiers qui vont servir comme source.

Vérifies comment spécifier qu'un cpp fait partie des sources qui seront compilé (affiché dans une arborescence de l'IDE n'implique pas qu'il sera compilé/fait partie des sources).

Vu les erreurs, et la manière de coder "à l'arrache" du "créateur", je pense qu'au niveau des .h, il y en largement plus qu'il n'en faut.

-
Edité par bacelar 11 février 2020 à 18:37:42

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
11 février 2020 à 19:37:31

YazidHadni a écrit:

il y a 2 fonctions "main" mais dans 2 fichiers différents

On dit souvent du mal du cours, mais il faut quand même reconnaître quand le problème ne vient pas du cours mais du lecteur. Le cours explicitement :

Le fichier math.cpp au complet est donc :

avec le code, qui ne contient évidemment pas de fonction main.

Je n'ai pas Code::Block sous la main pour vérifier les instructions pour créer ces fichiers, mais cette partie du cours me semble détaillé et correct. Il faut juste lire correctement, a priori.

-
Edité par gbdivers 11 février 2020 à 19:38:09

  • Partager sur Facebook
  • Partager sur Twitter
31 juillet 2020 à 19:01:25

Bonjour,

Après beaucoup de relecture et après avoir tester correctement le code du cours, il y a bien un problème:

la fonction ajouteDeux() n'est apparemment pas défini.     

Message d'erreur:

<code>

[Running] cd "/Users/wahibamehdi/Desktop/c++2/" && g++ main.cpp -o main && "/Users/wahibamehdi/Desktop/c++2/"main
main.cpp:10:9: error: use of undeclared identifier 'ajouteDeux'
b = ajouteDeux(a); //Appel de la fonction
^
1 error generated.

[Done] exited with code=1 in 10.615 seconds



</code>

voici les codes:

pour maths.cpp (fichier source)

<code>

#include"math.h"

intajouteDeux(intnombreRecu)
{
intvaleur(nombreRecu +2);

return valeur;
}

</code>

maths.hpp - maths.h (fichier d'en tête)

<code>

#ifndefMATH_H_INCLUDED
#defineMATH_H_INCLUDED

intajouteDeux(intnombreRecu);

#endif // MATH_H_INCLUDED

</code>

main.cpp  (fichier principale)

<code>

#include<iostream>
#include"math.h"
usingnamespacestd;

intmain()
{
inta(2),b(2);
cout <<"Valeur de a : "<< a << endl;
cout <<"Valeur de b : "<< b << endl;
b =ajouteDeux(a); //Appel de la fonction
cout <<"Valeur de a : "<< a << endl;
cout <<"Valeur de b : "<< b << endl;

return0;
}

</code>

et il y a bien une erreur, malheureusement je ne la trouve pas... si quelqu'un pourrait m'aider, ca aiderai aussi beaucoup de gens, ce serait super sympa.

Merci d'avance!

A.M.A.T

PS: j'ai écrit un message à Matthieu Nebra ( celui qui a fait le cours) j'attends une réponse et je reviendrai si il y a une réponse...

-
Edité par pro_grammeur 31 juillet 2020 à 19:24:40

  • Partager sur Facebook
  • Partager sur Twitter
31 juillet 2020 à 19:35:17

Il est preferable de lancer une nouvelle discussion plutot que de presenter ton probleme dans la discussion d'un autre.

Tu n'as pas le meme probleme. Ton probleme vient du fait que tu n'as pas ajouté correctement ton fichier maths.cpp a ton projet dans code::block. C'est un probleme qui arrive souvent. Regarde dans la doc pour savoir comment un fichier source doit etre ajouté dans C::B (je ne connais pas trop cet IDE)

  • Partager sur Facebook
  • Partager sur Twitter
31 juillet 2020 à 19:42:14

je suis sur visual studio code
  • Partager sur Facebook
  • Partager sur Twitter
31 juillet 2020 à 19:48:38

Pour le coup, Visual Code est trop recent pour etre dans le cours. Donc tu as du lire un autre tuto en plus pour l'utiliser, je suppose. Dans tous les cas, le probleme est le meme : maths.cpp n'est pas compilé ou lié au projet. Il faut regarder la doc de ton IDE.
  • Partager sur Facebook
  • Partager sur Twitter
31 juillet 2020 à 21:25:18

Merci pour les explications, oui j'utilise l'extension .run sur vs code pour complier mes projets...

Dans le cours, il ya ce paragraphe au quel il ne faut donc pas faire attention:

“On inclut toujours le fichier d'en-tête (.h), jamais le fichier source (.cpp).”

lorsque l'on rajpute la ligne " #include "maths.cpp" dans le fichier principale, tout fonctionne...

voila, au cas où si d'autres personnes cherchent

-
Edité par pro_grammeur 1 août 2020 à 17:41:13

  • Partager sur Facebook
  • Partager sur Twitter
18 janvier 2023 à 1:22:21

Salut j'utilise l'extension code runner de vscode pour compiler mes fichiers c++ mais le prochain est que je n'arrive pas à compiler plis fichier en même temps

  • Partager sur Facebook
  • Partager sur Twitter
18 janvier 2023 à 6:27:58

@SnadeKing Bonjour, merci de ne pas déterrer d'ancien sujet pour une nouvelle question.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter