Problème avec les "include" en C++
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

Problème avec les "include" en C++



  1. #1
    invitea29b3af3

    Problème avec les "include" en C++


    ------

    Bonjour, NE FUYEZ PAS
    (je sens que certains auront envie de fuir en voyant la longueur du message mais je vous rassure c'est pas si long et c'est sûrement tout simple pour quelqu'un qui maîtrise un peu mieux le C++ que moi)

    J'ai écrit un programme assez massif en C++ avec une dizaine de classes, et j'ai des problèmes avec les dépendances des classes entre elles. En clair:

    -J'ai un fichier "mes_includes.h" dans lequel j'ai des inclusions globales et une ou deux constantes, genre comme ça:
    Code:
    #include <vector>
    #include <cmath>
    #include <string>
    using namespace std;
    const int N = 7;
    - J'ai les classes A,B,C qui sont utilisées dans à peu près toutes les autres classes. En revanche, elles sont totalement indépendantes entre elles sauf la A et la B qui dépendent l'une de l'autre, donc au début de mon A.h j'ai:
    Code:
    #include "mes_includes.h"
    #include "B.h"
    
    class B;
     
    class A {
    ...blabla...
    };
    Tandis qu'au début de mes classes B et C j'ai seulement:
    Code:
    #include "mes_includes.h"
    Comme je l'ai dit, ces classes ne dépendent pas des autres classes D à M. De plus, ma classe D est elle aussi totalement indépendante et utilisée par presque toutes les autres classes de E à M). Donc pour faire d'une pierre deux coups et inclure mes A.h, B.h, C.h et D.h d'un seul coup dans mes classes E à M, j'ai mis ceci au début de mon fichier .h de ma classe D:
    Code:
    #include "A.h"
    #include "B.h"
    #include "C.h"
    Et ensuite, dans chacune de mes classes restantes (classes E à M), j'ai :
    Code:
    #include "D.h"
    Petit détail encore, mes classes E à M sont indépendantes entre elles sauf la classe E qui a besoin de la classe F (mais pas inversement). Donc dans le .h de ma classe E j'ai mis ça (en plus de #include "D.h") :
    Code:
    #include "F.h"
    
    class F;
    
    class E {
    ....blabla
    };
    Et finalement j'ai un fichier main.cpp qui a besoin de toutes les classes sans exception, et au début duquel j'ai littéralement inclus les .h de toutes les classes sans exception, de A à M, ainsi que mon "mes_includes.h".

    Et voilà enfin mon problème: à la compilation, j'ai une liste assez énorme de "Undefined symbols", genre ma classe L qui ne trouve pas une méthode de ma classe D, ma classe E qui ne trouve pas une méthode de ma classe F, mon main qui ne trouve pas des méthodes de certaines classes entre E et M... enfin bref c'est un vrai massacre.

    Je veux bien que vous ne pouvez pas me dire miraculeusement fait ça et paf ça marchera, mais au niveau de mon raisonnement ci-dessus, est-ce que je fais ça juste, ou pas ?

    Enorme merci d'avance.

    -----

  2. #2
    Jack
    Modérateur

    Re : Problème avec les "include" en C++

    mon main qui ne trouve pas des méthodes de certaines classes entre E et M... enfin bref c'est un vrai massacre.
    fais des include des classes manquantes

    en principe en C++, le fichier d'entête de chaque classe commence par
    #ifndef _ma_classe_
    #define _ma_classe_
    ...
    #endif

    afin de gérer les problèmes d'inclusions multiples et donc de redéfinition.

    De plus, es-tu obligé d'utiliser des constantes globales? C'est assez mal vu en programmation objet.

    A+

  3. #3
    invitea29b3af3

    Re : Problème avec les "include" en C++

    Bonjour, merci pour la réponse.
    J'ai effectivement oublié de la préciser mais j'ai déjà mis par exemple ça dans une de mes classe qui s'appelle BestCombi, dans le .h j'ai mis:
    Code:
    #ifndef _BESTCOMBI_H
    #define _BESTCOMBI_H
    ...
    #endif
    mais ça ne marche quand même pas

    Pour les var globales oui effectivement c'est pas très "propre" mais c'est pour qu'un programmeur qui réutilise mon code puisse changer 1 ou 2 paramètres (mais pas l'utilisateur).

  4. #4
    invite895675d5

    Re : Problème avec les "include" en C++

    Le conseil de Jack doit-être appliqué sur chaque fichier d'entête, c'est au moins une sécurité même si dans ton cas ça ne sera pas forcément la solution.
    Et ça évite de se creuser la tête sur les includes alors qu'il y a d'autres problèmes à résoudre en prog.

    Concernant le problème que tu décris, ça peut aussi être tout simplement des fautes de frappes quand tu appelles les fonctions. As-tu vérifier cette possibilité ?
    Pense aussi aux erreurs d'accolades, points virgules, etc... ça donne parfois ce message d'erreur.

  5. A voir en vidéo sur Futura
  6. #5
    invitea29b3af3

    Re : Problème avec les "include" en C++

    Bonjour,

    Oui oui j'ai bien mis ça pour chaque fichier d'en-tête.

    Et concernant le code en lui-même, en fait je fais suite à ce sujet que j'avais lancé:
    http://forums.futura-sciences.com/pr...lus-court.html
    ..et dans lequel toi et Jack me proposiez de dé-dégueulasser mon code en faisant des classes qui regroupent des méthodes qui vont plus ou moins ensemble. Donc en gros mon code marchait parfaitement, pas de fautes de frappe ou autre, ensuite il y a bien sûr eu quelques changements au moment du dé-dégueulassage de code (c'est à dire au moment de créer toutes ces classes) mais presque rien. Et s'il manquait une paranthèse ou autre ca me ferait une autre erreur que ça non?
    Mes changements en gros se résume à quelque chose comme ça, par exemple pour une fonction "chercheMax", avant j'avais:
    Code:
    chercheMax( liste );
    et maintenant avec une classe Utilitaire:
    Code:
    Utilitaire util;
    util.chercheMax( liste );
    ce qui est juste, non?

  7. #6
    Jack
    Modérateur

    Re : Problème avec les "include" en C++

    oui.

    Mais pour en revenir aux messages undefined symbol, pourquoi nas-tu pas systématiquement inclus les fichiers d'entête des classes dont tu as besoin?

    A+

  8. #7
    invite2d7144a7

    Re : Problème avec les "include" en C++

    Bonjour,

    Au passage, il est déconseillé d'utiliser ce genre de truc dans un .h
    Code:
    using namespace std;

  9. #8
    invitea29b3af3

    Re : Problème avec les "include" en C++

    Mais pour en revenir aux messages undefined symbol, pourquoi nas-tu pas systématiquement inclus les fichiers d'entête des classes dont tu as besoin?
    Oui c'est vrai au fond. Je viens de le faire mais ça ne change rien.
    Au passage, il est déconseillé d'utiliser ce genre de truc dans un .h
    Ok, je vais changer ça, merci du conseil.

    Concernant mes Undefined symbols: tout en bas du message d'erreur, j'ai ça:
    ld: symbol(s) not found
    collect2: ld returned 1 exit status
    J'ai cherché sur internet pour voir si quelqu'un avait eu la même chose j'ai trouvé ça, c'est pas exactement le même problème mais apparemment le même message d'erreur:
    http://stackoverflow.com/questions/5...in-crt1-10-5-o
    et un type lui explique que... ben justement je comprends pas tout à fait. C'est apparemment à la compilation le problème...?

  10. #9
    Jack
    Modérateur

    Re : Problème avec les "include" en C++

    Au fait, tu développes avec quoi? Si j'ai le même système, je veux bien essayer de le compiler ton programme pour voir ce que ça donne exactement comme erreur.

    A+

  11. #10
    invitea29b3af3

    Re : Problème avec les "include" en C++

    Bonjour,

    Le problème si je t'envoie mon code c'est que je développe avec une librairie graphique (pour le traitement d'images et la vision par ordinateur) nommée Opencv qui est relativement (voire très) lourde et merd*que à installer et à utiliser... Mais je t'envoie ici un extrait du message d'erreur (les noms des classes ont été changé en lettres de nouveau et les fonctions ont des noms à coucher dehors, ne pas y faire attention.

    Et plus bas je te mets mon makefile que j'utilise, y'a peut-être un problème là aussi?
    Merci encore.

    Code:
    Undefined symbols:
      "D::findIndOfMin(std::vector<float, std::allocator<float> >)", referenced from:
          findIndOnbrd(int, int*)     in J.o
          cmpHts(int, double*, B*) in J.o
      "I::findBs(double*, int*)", referenced from:
          _main in main.o
      "D::robmo(_IplImage*)", referenced from:
          H::findNbOfAsAndCl(_int*, std::vector<int, std::allocator<int> >*, int*) in H.o
      "I::locaBs(int, int*, double*, double*, std::vector<int, std::allocator<int> >*)", referenced from:
          _main in main.o
          _main in main.o
    .........etc pareil pendant 150 lignes........ et à la fin:
    ld: symbol(s) not found
    collect2: ld returned 1 exit status
    make: *** [prog] Error 1
    makefile:
    Code:
    CC = g++-4.2 -arch i386
    EXEC_NAME = prog
    LIBS = -I /usr/local/include/opencv -L/usr/local/lib -lcxcore -lcv -lcvaux -lhighgui -lml
    OBJ_FILES = A.o B.o C.o D.o E.o F.o G.o H.o I.o J.o K.o L.o M.o main.o
    
    all : $(EXEC_NAME)
    
    clean :
    	rm $(EXEC_NAME) $(OBJ_FILES)
    
    $(EXEC_NAME) : $(OBJ_FILES)
    	$(CC) -o $(EXEC_NAME) $(OBJ_FILES) $(LIBS)
    
    %.o: %.cpp
    	$(CC) -o $@ -c $<

  12. #11
    Jack
    Modérateur

    Re : Problème avec les "include" en C++

    difficile à dire ce qui cloche ...

    A+

  13. #12
    invite895675d5

    Re : Problème avec les "include" en C++

    As-tu essayé de "décomposer" la compilation (à la main) histoire de voir si ça fonctionne :
    cc -c A.c
    cc -c B.c
    ...
    cc -c main.c
    cc -o prog A.o B.o ... main.o

  14. #13
    invitea29b3af3

    Re : Problème avec les "include" en C++

    Vous savez, sur Terre, il y a parfois des gens qui méritent des baffes.

    Je fais partie de ces gens-là.

    Non mais sérieux... Honnêtement, si c'était possible de gifler les gens par internet, je vous donnerais droit à une bonne douzaine de gifles chacun sur ma tronche de c**.

    Traduction : j'ai trouvé mon erreur. Et c'est vraiment une erreur monstrueusement débile, et je suis encore gentil.

    Désolé de vous avoir fait perdre votre temps, vraiment.

    Pour les attardés comme moi qui un jour se retrouveront avec ce message d'erreur et tomberont sur ce forum, c'est que vous avez oublié de mettre NomDeMaClasse:: devant les définitions de certaines de vos méthodes de classes. Si, si. C'était juste ça.



    Encore une fois, désolé de vous avoir fait perdre votre temps. J'étais persuadé que le problème venait des includes, je sais pas pourquoi.

  15. #14
    Jack
    Modérateur

    Re : Problème avec les "include" en C++

    pas de problème. Si tu passes dans la région je suis prêt à honorer ta demande

    A+

  16. #15
    invitea29b3af3

    Re : Problème avec les "include" en C++

    Haha faut pas te sentir obligé, c'était une offre plutôt qu'une demande

    A+ et bonne année

Discussions similaires

  1. "fondamentales", "dures", "molles" ... : comment classer les sciences ?
    Par invite3e35cfa1 dans le forum Epistémologie et Logique (archives)
    Réponses: 13
    Dernier message: 22/04/2017, 23h41
  2. Fabrication d'un Caloduc avec "Soude" capteur solaire "maison"
    Par invite4e82960f dans le forum Physique
    Réponses: 9
    Dernier message: 30/10/2008, 08h19
  3. probleme avec les "exe"
    Par invite7f03ac46 dans le forum Logiciel - Software - Open Source
    Réponses: 12
    Dernier message: 24/05/2008, 09h04
  4. c++ : probleme avec "cin" et "cout"
    Par invite70eda27f dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 12/03/2008, 23h01
  5. Galerie dynamique - fonction "include"
    Par invitec418c418 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 5
    Dernier message: 24/10/2006, 22h25