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 :

makefile


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut makefile
    bonjour, dans un précédent post (cf http://www.developpez.net/forums/vie...php?t=430761), Emmanuel Delahay m'a conseillé de compiler avec les options -Wall -Wextra -O2.

    Or il ne reconnait pas l'option -Wextra (option inconue comme message d'erreur). Je vous envoie donc mon Makefile, pourriez vous s'il vous plait me dire votre avis. Merci

    PS : il y a bcp de commentaires car je me suis inspiré de ce forum pour faire mon Makefile.

    # inspire de http://gl.developpez.com/tutoriel/outil/makefile/

    # Quelques variables internes au Makefile
    # $@ Le nom de la cible
    # $< Le nom de la première dépendance
    # $^ La liste des dépendances
    # $? La liste des dépendances plus récentes que la cible
    # $* Le nom du fichier sans suffixe

    # compilateur utilise
    CC=gcc #CPP pour le C++ et CC pour le C

    # CFLAGS regroupe les options de compilation (Généralement cette variable est nommées CFLAGS pour une compilation en C, CXXFLAGS pour le C++)
    # ces options ont ete chopees sur http://www.developpez.net/forums/viewtopic.php?t=418583
    #CFLAGS=-Wall -O2 -Wchar-subscripts -Wcomment -Wformat=2 -Wimplicit-int -Werror-implicit-function-declaration -Wmain -Wparentheses -Wsequence-point -Wreturn-type -Wswitch -Wtrigraphs -Wunused -Wuninitialized -Wunknown-pragmas -Wfloat-equal -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wwrite-strings -Wconversion -Wsign-compare -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wmissing-noreturn -Wformat -Wmissing-format-attribute -Wno-deprecated-declarations -Wpacked -Wredundant-decls -Wnested-externs -Winline -Wlong-long

    CFLAGS=-Wall -O2 #ici si je mets CFLAGS=-Wall -Wextra -O2 l'option -Wextra n'est pas reconnue

    # LDFLAGS regroupe les options de l'édition de liens
    LDFLAGS=-Wall -Wextra -O2 -lm

    # on inclut tous les headers
    INCLUDE_DIR=../include

    # EXEC contient le nom des exécutables à générer.
    EXEC=out

    # Fichiers sources
    SRC= $(wildcard ../Fonctions_auxiliaires/*.c) main.c donnees_systeme.c donnees_initiales.c $(wildcard ../CVode/source/*.c)

    # Fichiers objets le .c est remplace par un .o
    OBJ=$(SRC:.c=.o)

    # Regles de compilation:
    all: $(EXEC)

    out: $(OBJ)
    @$(CC) -o $@ $^ $(LDFLAGS)

    # Creation des .o à partir des .c qui se verront appelés par défaut.
    %.o: %.c
    @$(CC) -o $@ -c $< -I$(INCLUDE_DIR) $(CFLAGS)

    clean:
    rm -rf $(EXEC) $(OBJ) *~

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    oups... pour éviter les confusion, lorsque j'ai dit

    Or il ne reconnait pas l'option -Wextra (option inconue comme message d'erreur)
    il faut comprendre que "il" n'est pas Emmanuel mais mon compilateur gcc 3.3

  3. #3
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    bien le bonjour,

    l'option -Wextra est arrivée depuis gcc 3.4
    les versions précédentes de gcc utilisaient -W

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Salut, merci de cette info.
    Depuis que j'ai mis l'option -W, j'ai tout plein de warning qui apparaissent..

    Mais que fait l'option -Wall ? N'affiche-t-elle pas tous les warnings (d'où son nom d'ailleurs) ?

    Merci.

  5. #5
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Pas tout a fait.

    Ma version de gcc est la 3.3.3 mais je ne pense pas que trop de choses aient change depuis.

    l'option -Wall active tous les messsages de warning. Du moins tous ceux qui sont decrits avant elle dans le manuel...

    Il existe des option supplementaires que l'on peut rajouter si on aime bien les warning.
    pour les activer, on utilise l'option -W.

    C'est pour cela que son nom a ete change en -Wextra, c'est plus clair.

    Petit parenthese, il existe egalement d'autre options de gcc qui sont interessantes. Je pense notamment a -pedantic, et eventuellement a -ansi.

    Have fun !
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    re
    aie aie aie, je viens de mettre l'option -pedantic et j'ai encore tous plein de message qui apparaissent, dont notamment celui-là :

    main.c:494: attention : un élément de l'initialisation n'est pas évaluable lors du chargement
    voici le code en question :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    realtype T=NV_Ith_S(y,udata->nb_especes); <-- je recupere la nb_especes-1 ième composante de mon vecteur y
        realtype RT=udata->R*T;
        realtype temp2=T*T;
        realtype temp3=T*temp2;
        realtype temp4=T*temp3;
        realtype inv_T=UN/T;
     
        realtype O[7]={log(T)-UN,T/DEUX, temp2/SIX, temp3/DOUZE, temp4/VINGT, -inv_T, UN};  <-- ceci est la ligne en question
    UN, DEUX, SIX, DOUZE, VINGT sont des constantes définies par un #define

    Pourquoi est-ce que le fait d'écrire par exemple temp2/SIX me donne un warning

    PS : ce ne sont que des warning, mais mon prgm s'exécute correctement

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    re, c'est encore moi.
    Je viens de mettre l'option -ansi, mais là j'ai carrément des error !!

    exemple :

    In file included from ../Fonctions_auxiliaires/engine.c:3:
    ../include/engine.h:7: error: erreur de syntaxe before '/' token
    ../include/engine.h:7: attention : pas de point virgule à la fin de la structure ou de l'union
    et voici mon engine.h

    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
     
    #ifndef _ENGINE_H_
    #define _ENGINE_H_
     
    #include "sundialstypes.h"   /* definition of type realtype */
     
    typedef struct{
        realtype regime; // regime du moteur
        realtype alesage;// longueur de l'alesage
        realtype bielle;// longueur de la bielle
        realtype Dco; // demie-course
        realtype taux_compression; // taux de compression
        realtype six_regime;//6.0*regime;
        realtype constante1;//PI*alesage*alesage/4.0;
        realtype constante2;//bielle+Dco
        realtype bielle2;//bielle*bielle
        realtype dtheta_dt;// derivee de la fonction theta(t) par rapport au temps, theta(t) = angle vilebrequin en fonction du temps (angle converti en radian) en rad/s
        realtype cylindree; // cylindree unitaire (volume deplace par le piston entre le PMB et le PMH)  2*Dco pour avoir la course complete du piston
        realtype Vm; // volume mort
    } Engine;
     
    Engine * CreateEngine(realtype,realtype,realtype,realtype,realtype);
    void DestroyEngine(Engine *);
    void CopyEngine(Engine *,Engine *);
     
     
    #endif
    j'ai du mal à voir mon erreur.

    Pouvez-vous m'aider.

    Donc là ma ligne de compilation (dans mon Makefile) est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CFLAGS=-Wall -W -pedantic -ansi -O2

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: makefile
    Citation Envoyé par salseropom
    bonjour, dans un précédent post (cf http://www.developpez.net/forums/vie...php?t=430761), Emmanuel Delahaye m'a conseillé de compiler avec les options -Wall -Wextra -O2.

    Or il ne reconnait pas l'option -Wextra (option inconue comme message d'erreur).
    Ton compilateur est ancien... Essaye -W à la place.
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par salseropom
    Je viens de mettre l'option -ansi, mais là j'ai carrément des error !!

    exemple :

    In file included from ../Fonctions_auxiliaires/engine.c:3:
    ../include/engine.h:7: error: erreur de syntaxe before '/' token
    En C90, seuls les commentaires /* */ sont admis.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CFLAGS=-Wall -W -pedantic -ansi -O2
    -ansi et -pedantic sont réservés au code que l'on veut strictement conforme. C'est pas toujours possible, et avec les dernières versions de gcc, les headers standards ne passent plus avec ces flags !
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par salseropom
    aie aie aie, je viens de mettre l'option -pedantic et j'ai encore tous plein de message qui apparaissent, dont notamment celui-là :
    main.c:494: attention : un élément de l'initialisation n'est pas évaluable lors du chargement
    voici le code en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    realtype T=NV_Ith_S(y,udata->nb_especes); <-- je recupere la nb_especes-1 ième composante de mon vecteur y
        realtype RT=udata->R*T;
        realtype temp2=T*T;
        realtype temp3=T*temp2;
        realtype temp4=T*temp3;
        realtype inv_T=UN/T;
     
        realtype O[7]={log(T)-UN,T/DEUX, temp2/SIX, temp3/DOUZE, temp4/VINGT, -inv_T, UN};  <-- ceci est la ligne en question
    UN, DEUX, SIX, DOUZE, VINGT sont des constantes définies par un #define

    Pourquoi est-ce que le fait d'écrire par exemple temp2/SIX me donne un warning

    PS : ce ne sont que des warning, mais mon prgm s'exécute correctement
    En mode strict, tu ne peux pas initialiser une variable avec une autre variable. Logique, elle n'existe pas encore, et on ne sait pas ce qu'il y a dedans...

    gcc est un compilateur puissant qui sait faire des choses... bizarres du point de vue de la norme... Est-ce bien défini ? Pas du point de vue du langage C, en tout cas...
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Bonjour, et bien mercis pour toutes ces précisions.
    J'ai de quoi bosser (pour enlever tous ces warnings).

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Et quand tu auras fini, tu pourras rajouter -Wwrite-strings pour définir toutes tes chaînes de caractères en const
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Et quand tu auras fini, tu pourras rajouter -Wwrite-strings pour définir toutes tes chaînes de caractères en const
    mais si j'utilise cette option, est-ce que je pourrais toujours faire s="toto" par exemple, où s est une string ? Si elle est constante, je ne pourrai pas changer sa valeur (enfin... normalement) ?

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par salseropom
    -Wwrite-strings
    mais si j'utilise cette option, est-ce que je pourrais toujours faire s="toto" par exemple,
    oui
    où s est une string ?
    non, s n'est pas une string. C'est un pointeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       char const *s;
     
       s  = "toto";
    Si elle est constante, je ne pourrai pas changer sa valeur (enfin... normalement) ?
    Ce que tu ne peux plus faire, c'est
    ou
    En fait, voilà exactement comment ça se passe :

    Soit le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <stdio.h>
    int main (void)
    {
       char *s = "toto";
     
       strcpy(s, "xx");
       return 0;
    }
    Le comportement est indéfini :

    A l'exécution : crash sous Windows. (Normal, tentative d'écriture dans une chaine).

    Si on ajoute l'option -Wwrite-strings, on a iun message un peu sybillin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Compiling: main.c
    main.c: In function `main':
    main.c:4: warning: initialization discards qualifiers from pointer target type
    qu'il faut apprendre à repérer et à interpréter. En fait, il signale que le qualificateur de la variable a été annulé par le qualificateur de la constante qui servi a l'initialiser. En effet, la constante chaine est maintenant qualifiée de 'const'. Le pointeur doit donc aussi être qualifiée de const :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <stdio.h>
    int main (void)
    {
       char const *s = "toto";
     
       strcpy(s, "xx");
       return 0;
    }
    Le message se déplace maintenant sur strcpy() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Compiling: main.c
    main.c: In function `main':
    main.c:6: warning: passing arg 1 of `strcpy' discards qualifiers from pointer target type
    En effet, le paramètre de destination de strcpy() est de type char *. Normal, puisqu'on est censé pouvoir modifier la valeur pointée. Donc, le compilateur signale l'incohérence. L'erreur de conception a donc été mise en évidence.

    Correction : définir non pas un pointeur sur une chaine, mais un tableau de char (initialisé ou non, peu importe). Evidemment, on retire le qualificateur 'const'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <string.h>
    int main (void)
    {
       char s[] = "toto";
     
       strcpy(s, "xx");
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    mais alors quel est l'intérêt de cette option s'il faut faire toutes ces manip ?

  16. #16
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    être sûr qu'on n'écrira jamais dans une constante chaîne.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par salseropom
    mais alors quel est l'intérêt de cette option s'il faut faire toutes ces manip ?
    De détecter des erreurs de conception.

    J'ai pas été clair ?
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. Makefile et sed
    Par pitistef dans le forum Systèmes de compilation
    Réponses: 7
    Dernier message: 10/02/2004, 15h06
  2. [Makefile] [Avancé]Récupération de dépendances
    Par Ruok dans le forum Systèmes de compilation
    Réponses: 4
    Dernier message: 06/02/2004, 12h52
  3. [Debutant] Makefile
    Par Jfrancois57 dans le forum Systèmes de compilation
    Réponses: 8
    Dernier message: 26/01/2004, 13h18
  4. Makefile
    Par Wisefool dans le forum Systèmes de compilation
    Réponses: 2
    Dernier message: 03/11/2003, 17h41
  5. Compilation avec un Makefile
    Par Mau dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 28/02/2003, 11h30

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