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 :

Problème de compilation séparée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut Problème de compilation séparée
    Bonjour à tous.

    je n'arrive pas à compiler mon projet avec un makefile

    Le projet est décomposé comme ça :

    widget.c
    widget.h

    label.c
    label.h

    top.c
    top.h

    test.c

    Avec comme contrainte ceci :

    top n'a pas de référence vers d'autre fichier.
    widget fait référence à top
    label fait référence à widget et à top
    test fait référence à top et label

    voici le makefile en question :
    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
    17
    18
    19
    20
     
    all :: test
     
    top.o : top.c top.h
    	gcc -c top.c top.h -Wall -Wextra -lSDL -lSDL_ttf
     
    widget.o : widget.c widget.h top.o
    	gcc -c widget.c widget.h top.o -Wall -Wextra -lSDL -lSDL_ttf
     
    label.o : label.c label.h widget.o
    	gcc -c label.c label.h widget.o top.o -Wall -Wextra -lSDL -lSDL_ttf
     
    test : test.c top.o label.o
    	gcc -o test test.c top.o label.o -lSDL -lSDL_ttf
     
    clean ::
    	rm -rf *.o
     
    mrproper :: clean
    	rm -rf test
    Et voici l'erreur :

    make: entrant dans le répertoire « /home/vincent/Bureau/SDL_GTK »
    gcc -c label.c label.h widget.o top.o -Wall -Wextra -lSDL -lSDL_ttf
    Using Makefile from ~/Bureau/SDL_GTK
    gcc: widget.o: linker input file unused because linking not done
    gcc: top.o: linker input file unused because linking not done
    gcc -o test test.c top.o label.o -lSDL -lSDL_ttf
    label.o: In function `Label_new':
    label.c.text+0x213): undefined reference to `Widget_get_width'
    label.c.text+0x21d): undefined reference to `Widget_get_height'
    collect2: ld returned 1 exit status
    make: quittant le répertoire « /home/vincent/Bureau/SDL_GTK »
    make: *** [test] Erreur 1
    Je ne comprend pas cette ligne
    gcc: top.o: linker input file unused because linking not done
    top.o est construit en premier cela ne devrait pas posser de problème pour l'édition de lien ?

    mais le plus embétant reste ceci :
    label.c.text+0x213): undefined reference to `Widget_get_width'
    label.c.text+0x21d): undefined reference to `Widget_get_height'

    mon fichier label.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #ifndef label_h
    #define label_h
     
    #include <SDL/SDL_ttf.h>
    #include <SDL/SDL.h>
     
    #include "top.h"
    #include "widget.h"
    [...]
    label.c contient #include "label.h"

    merci d'avance pour vos réponses.
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Il y a plusieurs confusions dans ton makefile

    un .o dépend d'un .c et de 0 ou plusieurs .h

    essaye ceci:
    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
    17
    18
    19
    20
    21
    22
    all :: test
     
    top.o : top.c top.h
    	gcc -c top.c -o top.o -Wall -Wextra -lSDL -lSDL_ttf
     
    widget.o : widget.c widget.h
    	gcc -c widget.c -o widget.o -Wall -Wextra -lSDL -lSDL_ttf
     
    label.o : label.c label.h
    	gcc -c label.c -o label.o -Wall -Wextra -lSDL -lSDL_ttf
     
    test.o : test.c
    	gcc -c test.c -o test.o -lSDL -lSDL_ttf
     
    test : test.o label.o widget.o top.o 
    	gcc -o test test.o label.o widget.o top-o -lSDL -lSDL_ttf
     
    clean ::
    	rm -rf *.o
     
    mrproper :: clean
    	rm -rf test
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par vincent.mbg
    Je ne comprend pas cette ligne
    gcc: top.o: linker input file unused because linking not done
    top.o est construit en premier cela ne devrait pas posser de problème pour l'édition de lien ?
    Bah normale tu lui dis de s'arrêter à l'assemblage et ne pas faire d'édition de liens pourtant tu lui fournis des fichiers objets.
    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
    17
    18
    19
    all :: test
     
    top.o : top.c top.h
    	gcc -c top.c top.h -Wall -Wextra -lSDL -lSDL_ttf
     
    widget.o : widget.c widget.h top.o
    	gcc -c widget.c widget.h top.o -Wall -Wextra -lSDL -lSDL_ttf
     
    label.o : label.c label.h widget.o
    	gcc -c label.c label.h widget.o top.o -Wall -Wextra -lSDL -lSDL_ttf
     
    test : test.c top.o label.o
    	gcc -o test test.c top.o label.o -lSDL -lSDL_ttf
     
    clean ::
    	rm -rf *.o
     
    mrproper :: clean
    	rm -rf test
    Citation Envoyé par vincent.mbg
    mais le plus embétant reste ceci :
    label.c.text+0x213): undefined reference to `Widget_get_width'
    label.c.text+0x21d): undefined reference to `Widget_get_height'
    Comme ça de vue je dirais qu'il faut rajouter widget.o à cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test : test.c top.o label.o
    	gcc -o test test.c top.o widget.o label.o -lSDL -lSDL_ttf
    Au passage si tu ne sais pas ce que sont les fichiers d'en-tête précompilés, ne met pas de fichier *.h dans une ligne de compilation.

  4. #4
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    génial

    merci d'avoir répondu malgrés l'heure tardif

    si j'ai bien compris, pour faire un .o pas besoin de linker j'ai donc aussi enlevé les options -lSDL -lSDL_ttf.

    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
    17
    18
    19
    20
     
    all :: test
     
    top.o : top.c top.h
    	gcc -c top.c top.h -Wall -Wextra
     
    widget.o : widget.c widget.h
    	gcc -c widget.c widget.h -Wall -Wextra
     
    label.o : label.c label.h
    	gcc -c label.c label.h -Wall -Wextra
     
    test : test.c top.o label.o widget.o
    	gcc -o test test.c top.o label.o widget.o -lSDL -lSDL_ttf
     
    clean ::
    	rm -rf *.o
     
    mrproper :: clean
    	rm -rf test
    Je trouve ça quand même étrange que par exemple cette ligne ne face pas criéer gcc
    gcc -c label.c label.h -Wall -Wextra

    label.h contient des références à des fonctions dans widget. Est-ce que ça sinifie que si j'ai une erreur par exemple dans le type d'argument transmis à une fonction je n'aurais pas d'erreur ?

    En ce qui concerne la ligne clean je pensais quelle serait appellée à la fin.
    Est-elle seulement appelée lors d'un make clean ?

    Encore merci
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  5. #5
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par vincent.mbg
    si j'ai bien compris, pour faire un .o pas besoin de linker j'ai donc aussi enlevé les options -lSDL -lSDL_ttf.
    Oui je les avais zappés.

    Citation Envoyé par vincent.mbg
    Je trouve ça quand même étrange que par exemple cette ligne ne face pas criéer gcc
    gcc -c label.c label.h -Wall -Wextra

    label.h contien des références à des fonctions dans widget. Est-ce que ça sinifie que si j'ai une erreur par exemple dans le type d'argument transmis à une fonction je n'aurais pas d'erreur ?
    Citation Envoyé par ssmario2
    Au passage si tu ne sais pas ce que sont les fichiers d'en-tête précompilés, ne met pas de fichier *.h dans une ligne de compilation.
    Citation Envoyé par vincent.mbg
    En ce qui concerne la ligne clean je pensais quelle serait appellée à la fin.
    Est-elle seulement appelée lors d'un make clean ?Encore merci
    Oui.

  6. #6
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    Envoyé par ssmario2
    Au passage si tu ne sais pas ce que sont les fichiers d'en-tête précompilés, ne met pas de fichier *.h dans une ligne de compilation.
    Désolé je ne l'avais pas vu la premièr fois (trop petit)

    Pour ce qui comme moi ne savent pas voici la réponse de la discution
    A quoi-servent-tetes-precompiles ?

    Citation Envoyé par koala01 Voir le message
    Salut,

    Comme tu l'as sans doute déjà remarqué, la compilation de tout un projet peut parfois prendre pas mal de temps.

    Comme tu le sais peut etre, la directive préprocesseur include a pour effet de copier le contenu du fichier inclu à l'endroit où se trouve la directive dans le code source.

    Du coup, si tu n'utilises pas les entete précompilées, le processus de compilation risque de prendre encore plus de temps, et, le pire, c'est qu'une bonne partie du processus n'aura pour seul but que de... recompiler maintes et maintes fois - en gros, chaque fois qu'une entete est incluse, y compris du fait des inclusions "indirectes" (de fichier qui inclu une entete qui inclu...) - des parties qui... ont déjà été compilées pour d'autres unités de traductions ...

    Le fait de décider d'utiliser les entetes precompilées a, tout simplement, pour but de dire au compilateur que
    et donc, au final, de gagner du temps à la compilation
    [EDIT] Grillé :'(
    Je mettrai un .h dans la commande gcc uniquement quand le développement concernant ce fichier sera terminé et que je ne veux pas qu'il soie recompilé à chaque fois

    C'est bon je crois que je suis prèt à moi les joie du C

    merci beaucoup
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

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

Discussions similaires

  1. Problème pour la compilation séparée
    Par mylha dans le forum Débuter
    Réponses: 2
    Dernier message: 29/03/2011, 16h44
  2. Problème simple de compilation séparée
    Par chrisdayton dans le forum Débuter
    Réponses: 7
    Dernier message: 03/12/2009, 07h50
  3. Problème de compilation séparée
    Par orfix dans le forum C
    Réponses: 9
    Dernier message: 25/06/2007, 11h07
  4. Problème de compilation séparée
    Par Kryptonaute dans le forum C
    Réponses: 13
    Dernier message: 16/05/2007, 11h08
  5. Réponses: 1
    Dernier message: 27/05/2002, 01h44

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