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

Linux Discussion :

Makefile , une seule erreur


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Par défaut Makefile , une seule erreur
    Bonsoir , voici mon environnement de programmation :

    mandriva 10.2 , gcc 3.4.3 , GNU Make 3.80 , voici précisément 2 code source en C :

    main.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
     
    #include <stdio.h>
    int my_alphabet1();
    int main(void)
     
    {
     
    my_alphabet1();
     
    return 0;
     
    }
    my_alphabet1.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <stdio.h>
     
    int my_alphabet1()
    {
     
    char c;
     
    for ( c = 'a'; c <= 'z'; ++c)
     
    putchar(c);
     
    }
    et voici le message que j'ai quand je tape make dans le shell :

    my_alphabet1.c: 1: error: syntax error before '<' token

    quelqu'un a une idée d'où le problème peut venir svp?
    merci

  2. #2
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Par défaut
    non attendez je me suis trompé pour le message d'erreur , je vais rectifier çà , putin c'est grave , 3 jours pour faire un makefile , ya rien qui marche

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Par défaut
    message d'erreur ( un truc de fou ) :

    gcc -w -wall - pedantic -c main.c my_alphabet1.c
    my_alphabet1.c : in function my_alphabet1
    my_alphabet1.c: c14: warning: control reaches end of non-void function
    gcc -w -wall - pedantic -c main.c my_alphabet1.c
    my_alphabet1.c : in function my_alphabet1
    my_alphabet1.c : warning: control reaches end of non-void function
    /usr/lib/gcc/i586-mandrake-linux-gnu/3.4.3/../../../crt1.o(text+0x18): in function _start
    ../sysdeps/i386/elf/start.S:115:undefined reference to main
    collect2: ld returned 1exit status

    et voici le makefile exact :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    #on utilise gcc comme compilateur par defaut
    CC=gcc
     
     
    #flags d'erreur
    ERROR_CFLAGS = -Wall -W -pedantic
     
     
    #on indique quelques drapeux passes au compilateur
    CFLAGS=$(ERROR_FLAGS)
     
     
    # Les flags  de link
    LDFLAGS=$(ERROR_FLAGS)
     
     
     
     
    #on construit le programme
    all: test
     
     
    #compilation des fichiers
    test: main.c my_alphabet1.c
       gcc -W -Wall -pedantic -c main.c my_alphabet1.c
        gcc -W -Wall -pedantic -o test main.o my_alphabet1.o
     
     
    #nettoyage...
    clean:
       rm -f *.o *~ core test

  4. #4
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 820
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 820
    Par défaut
    Salut,

    là, ce n'est pas ton makefile qui foire, c'est tes fichiers .c!!!

    Alors, pour commencer, un fichier source c doit se terminer par un retour à la ligne.
    C'est comme ça.
    Ca t'enlèveras déjà certaines erreurs.

    Ensuite, quand on déclare une fonction:
    on s'attend un peu à ce qu'elle retourne un int en résultat (c'est pour ça que le compilateur hurle "warning: control reaches end of non-void function")... chose que la tienne ne fait pas...

    Voilà, en corrigeant ça, ça compile nickel.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Par défaut
    donc en gros je n'ai qu'à faire ceci comme correction :

    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
     
    #include <stdio.h>
     
    int my_alphabet1()
    {
     
    char c;
     
    for ( c = 'a'; c <= 'z'; ++c)
     
    putchar(c);
     
    return int;
     
    }

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Par défaut
    après correction :

    message d'erreur en tapant make :

    pas de regle pour fabriquer la cible main.c , necessaire pour test . arret .


  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Par défaut
    c'est pas possible je vais jamais yarriver , pourtant ya pas d'erreurs dans mon makefile ni dans mes fichiers .c là ...

  8. #8
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Par défaut
    oui ton makefile colle pas bien :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    #on utilise gcc comme compilateur par defaut
    CC=gcc
    #flags d'erreur
    ERROR_CFLAGS = -Wall -W -pedantic
    #on indique quelques drapeux passes au compilateur
    CFLAGS=$(ERROR_FLAGS)
    # Les flags  de link
    LDFLAGS=$(ERROR_FLAGS)
    #librairies utilisée (exemple)
    LIBS= -lc
    #on defini les sources
    SOURCE_C= \
        main.c \
        my_alphabet1.c 
     
    #liste d'objet pour l'executable extraite de SOURCE_C
    OBJECTS=$(SOURCE_C:.c=.o)
    #on construit le programme
    all: test
     
    #regles pour gerer les dependence (*.h)
    %.d: %.c
    	$(CC) -M $(INCLUDES) $< >$@
     
    #regle de passage .c en .o
    %.o:%.c %.d
    	$(CC)  $(CFLAGS) -c $<
     
    #compilation des fichiers
    test: $(OBJECTS)
        $(CC)  $(CFLAGS) $(LDFLAGS) $(OBJECTS) -o $@ $(LIBS)
     
    #afin de gerer les fichiers de dependences ...
    include $(SOURCE_C:.c=.d)
     
    #nettoyage...
    clean:
       rm -f *.o *~ core test
    la generation des %.d n'est pas obligatoire mais t'evite de devoire manuellement gérer les dependence source .h lorsceque qu'un grand nombre de fihcier interviennent

  9. #9
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Par défaut
    bon ok mais j'en ai assez de ces makefile de 50 lignes que je pompe un peu partout , pour mon minable programme en C ya pas moyen plutot de faire un makefile de 5 lignes , moi je veux juste que mon makefile compile mes fichiers .c et que j'exécute test...

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par Bibouda
    donc en gros je n'ai qu'à faire ceci comme correction :

    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
     
    #include <stdio.h>
     
    int my_alphabet1()
    {
     
    char c;
     
    for ( c = 'a'; c <= 'z'; ++c)
     
    putchar(c);
     
    return int;
     
    }
    Non pas du tout, la tu veut retourner un type donc ici int, il faut retourner le résultat sous la forme d'un int donc à ce que j'en deduit dans ton code il faut faire return c; si c'est ce que tu veut revoyer comme valeur !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  11. #11
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Tout d'abord on se calme. La patience et l'obstination sont des vertus en programmation, notamment en C.
    Ensuite on corrige ses fichiers sources:

    main.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int my_alphabet1(void);
     
    int main(void)
    {
        my_alphabet1(); /* retourne un entier, ignore ici */
     
        return 0;
    }
    my_alphabet1.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdio.h> 
     
    int my_alphabet1(void)
    {
       int c;
     
       for(c='a'; c <= 'z'; c++)
       {
          putchar(c);
       }
     
       return 0;
    }
    Pour former l'executable, il faut un makefile. L'executable toto depend de deux fichiers objets, main.o et my_alphabet1.o. Ces fichiers objets sont crees par la compilation des fichiers sources correspondants. Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CFLAGS=-W -Wall -ansi -pedantic
     
    toto: main.o my_alphabet1.o
    <tab>gcc ${CFLAGS} main.o my_alphabet1.o -o toto
     
    main.o: main.c
    <tab>gcc ${CFLAGS} -c main.c
     
    my_alphabet1.o: my_alphabet1.c
    <tab>gcc ${CFLAGS} -c my_alphabet1.c
    Tu pourras simplifier le Makefile ensuite en donnant des regles par defaut, mais ce sera pour plus tard.

    Donc:
    - continuer a apprendre le C, tu as des lacunes
    - utiliser des Makefile pre-fabriques APRES avoir compris ce qui se passe.

  12. #12
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Par défaut
    bon j'ai corrigé et mis return c mais bon sang çà fait 4 jours que j'essaye de faire un makefile pour compiler ces 2 petits fichiers , j'en ai essayé 3 et aucun ne marche , quelqu'un peut il me faire vraiment le makefile le plus petit mais que au moins il marche , là j'ai ce message d'erreur :

    make : *** pas de regle pour fabriquer la cible main.c , necessaire pour test . Arret

    Pourant mes fichiers .c sont bons , et mes .c sont tous dans le meme répertoire , ainsi que le makefile , alors qu'est ce qui foire encore...

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    #on utilise gcc comme compilateur par defaut
    CC=gcc
     
     
    #flags d'erreur
    ERROR_CFLAGS = -Wall -W -pedantic
     
     
    #on indique quelques drapeux passes au compilateur
    CFLAGS=$(ERROR_FLAGS)
     
     
    # Les flags  de link
    LDFLAGS=$(ERROR_FLAGS)
     
     
     
     
    #on construit le programme
    all: test
     
     
    #compilation des fichiers
    test: main.c my_alphabet1.c
       gcc -W -Wall -pedantic -c main.c my_alphabet1.c
        gcc -W -Wall -pedantic -o test main.o my_alphabet1.o
     
     
    #nettoyage...
    clean:
       rm -f *.o *~ core test

  13. #13
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Le Makefile que j'ai donne fonctionne. Il est grossier, mais les bases y sont:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $ make toto
    gcc -W -Wall -ansi -pedantic -c main.c
    gcc -W -Wall -ansi -pedantic -c my_alphabet1.c
    gcc -W -Wall -ansi -pedantic main.o my_alphabet1.o -o toto
    $ toto
    abcdefghijklmnopqrstuvwxyz

  14. #14
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Par défaut
    lit ceci c'est simple court et fonctionnel :
    http://gl.developpez.com/tutoriel/outil/makefile/

  15. #15
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Par défaut
    salut dazumba , mais regarde comment veux tu que je comprenne , pour les fichiers sources vous donnez tous des réponses différentes... , je vais essayer exactement avec tes fichiers sources et ton makefile , on verra ce que çà donne...

  16. #16
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Par défaut
    dazumba , j'ai fait avec ta méthode , enfin çà marche , merci à tous de m'avoir aidé , j'ai essayé tous les makefile , seuls celui de dazumba marche , et c'est le plus simple , par contre il faudrait vous mettre d'accord sur les codes sources , dazumba me dit que dans my_alphabet on return 0 , et solidier qu'on return c , question de goût simplement? enfin vous proposez tous des trucs différents donc pour un débutant c'est impossible de juger une méthode de mecs plus expérimentés , encore merci .

    marg : j'ai bien lu le tuto de gl , mais honnetement je n'y comprends rien , je ne le trouve pas bien fait , çà n'explique pas du tout clairement ce que c'est une cible et dépendance... j'ai bcp mieux compris la notion de makefile avec les commentaires de soldier et les autres exemples .

Discussions similaires

  1. Servlet Erreur Insertion 2 fois pour une seule requete SQL
    Par cjohnson dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 11/03/2011, 11h58
  2. [W3C] [W3C] Une seule erreur pour validation W3C !?
    Par bond70 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 06/02/2009, 09h58
  3. Réponses: 1
    Dernier message: 22/09/2008, 13h18
  4. Erreur sur recherche dans une seule colonne
    Par raphael dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/04/2008, 14h31
  5. [eclipse][tomcat] Ne se relance plus apres une seul erreur
    Par Battosaiii dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 26/03/2006, 20h22

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