IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Pb. pour compiler un programme avec des *.h


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 128
    Points : 122
    Points
    122
    Par défaut Pb. pour compiler un programme avec des *.h
    Bonjour à tous.

    Je suis en train de lire le livre Accelerated C++. Je bloque sur l'exo 5-2. Je l'ai résolu, mais pas comme je le voudrais. Et je risque de rencontrer le même problème plusieurs fois par la suite.

    Je peux compiler le programme quand je mets tout le code dans un seul fichier (main-tout-en-un.cc), mais pas quand les fichiers sont dispersés (main.cc avec d'autres *.cc et *.h). Pourtant j'ai appris à utiliser la directive #ifndev...

    La compilation de main-tout-en-un.cc me renvoie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /tmp/ccLLVYvA.o: In function `main':
    main.cc:(.text+0xc0): undefined reference to `read(std::basic_istream<char, std::char_traits<char> >&, Student_info&)'
    main.cc:(.text+0xf0): undefined reference to `extract_fails(std::vector<Student_info, std::allocator<Student_info> >&)'
    main.cc:(.text+0x10d): undefined reference to `compare(Student_info const&, Student_info const&)'
    main.cc:(.text+0x138): undefined reference to `compare(Student_info const&, Student_info const&)'
    main.cc:(.text+0x252): undefined reference to `grade(Student_info const&)'
    collect2: ld a retourné 1 code d'état d'exécution
    À ce que je comprends, les fichiers sont bien importés, mais les fonctions ne sont pas trouvées.

    J'ai ajouté des petites infos au tout début des fichiers main*.cc (commande de compilation, logs, commande d'exécution). L'archive est en pièce-jointe. Je ne pense pas qu'il faille vraiment comprendre le code et le lire attentivement pour résoudre le problème. Enfin, j'espère, car sinon je n'aurais aucune chance d'avoir une réponse.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 128
    Points : 122
    Points
    122
    Par défaut
    Je vais devoir m'intéresser aux makefile. Le livre n'en parle même pas...

    Au départ j'avais essayé de décliner leur makefile, mais ça ne marchait pas. Je crois que l'erreur était d'ailleurs déjà la même.

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    la meilleure solution est la conception d'un Makefile.
    Bien sur tu peux t'en sortir en tapant une seule commande gcc ( qui sera longue ) mais à long terme cela ne t'aidera pas beaucoup.
    Sur le site il y a un excellent tuto sur les Makefile ici
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 128
    Points : 122
    Points
    122
    Par défaut
    Salut LittleWhite.

    J'avais commencé à lire ce tutoriel hier. Pour un pythoniste comme moi, les makefiles sont un peu déroutant (surtout quand on si vite confronté à un d'une soixantaine de lignes, sans la moindre explication).

    Il y a une erreur dans la section Variables internes: "-c" est manquant.

    Je n'ai pas réussi à compiler un programme basique avec la méthode Génération de la liste des fichiers objets (OBJ= $(SRC:.cc=.o)). Les suivantes et les précédentes ont fonctionné (je me suis arrêté à la 8).

    Les auteurs de Accelerated C++ n'utilisent pas de commandes entre le all et le clean, mais juste les dépendances:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cible: dependance
            commandes
    ->
    Il y a encore une chose que je ne comprends pas du tout. Si a.o (a.cc contenant le main()) inclut p.h et que p.o inclut q.h, la commande finale de compilation devra faire référence à p.o et à q.o. Pourquoi?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 128
    Points : 122
    Points
    122
    Par défaut
    Voici le code le makefile le plus passe-partout et le plus simple que j'ai pu trouver en bidouillant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    CC = g++
    EXEC = mon_executable
    SRC = $(wildcard *.cc)
    OBJ = $(SRC:.c=.o)
     
    all:	$(EXEC)
     
    $(EXEC):	$(OBJ)
     
    %.o:	%.c
     
    test:
    	./$(EXEC)
     
    clean:
    	rm -rf *.o $(EXEC)
    Par contre, avec un tel code, il faut veiller à ne pas mettre n'importe quel fichier *.cc dans le même répertoire que le makefile, parce qu'il serait pris en compte pour la création de l'exécutable final.

    Est-ce qu'un tel makefile est utilisable dans la majorité des cas?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Compiler un programme avec winapi.h
    Par mannostab dans le forum Langage
    Réponses: 2
    Dernier message: 06/10/2006, 22h06
  2. [Java] Script pour formatter un textarea avec des icones
    Par odoobe dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/09/2006, 09h30
  3. Pb pour encoder une adresse avec des &
    Par fpouget dans le forum Langage
    Réponses: 2
    Dernier message: 28/04/2006, 09h41
  4. Lancer un programme avec des arguments via IE...
    Par petozak dans le forum Général Conception Web
    Réponses: 6
    Dernier message: 24/03/2006, 11h51
  5. [Classpath][execution] executer un programme avec des jar.
    Par LoLoSS dans le forum Général Java
    Réponses: 11
    Dernier message: 26/08/2004, 11h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo