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 plusieurs questions sur les lignes de compilation ?


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 428
    Points : 170
    Points
    170
    Par défaut makefile plusieurs questions sur les lignes de compilation ?
    Bonsoir,

    j'aurai des questions sur les lignes de compilations suivante :

    pris sur le site de : http://perso.univ-lyon1.fr/jean-clau.../Makefile.html
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    structure.o : structure.c
        gcc -c -Wall structure.c
    et

    pris sur le site de : http://gl.developpez.com/tutoriel/outil/makefile/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    hello.o: hello.c
    	gcc -o hello.o -c hello.c -W -Wall -ansi -pedantic
    Pourquoi il y a une différence entre les deux.
    la deuxième méthode celle du developpez.com quelle est l'intérêt de mettre -o, pourquoi mettre les options de compilation à la fin ou est la logique ?
    Si je ne fait pas d'erreur quelle est l'intérêt de générer un exécutable de hello.o, puis de le retransformer en .o

    Je trouve plus logique la première : on dit avec quel compilateur on va compiler (ici gcc) ensuite on mets -c pour créer le fichier .o, puis les options de compilation puis le fichier à compiler en .o

    Merci d'éclairer ma lanterne

  2. #2
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Bonjour,
    les commandes ne génèrent pas un exécutable mais un fichier objet (.o). L'option qui dit à gcc de générer un fichier objet est -c.
    Je ne conseillerais pas d'utiliser les -W -Wall -ansi -pedantic ainsi. En effet -W (moins grand double vé = encore plus de warnings) est dangereux car on peut facilement le confondre avec -w (moins petit double vé = pas de warning du tout) ! Il a d'ailleurs été déprécié en faveur de -Wextra qui est plus clair. Tant qu'on y est on va oublier -ansi -pedantic car la norme C89 est vieille (28 ans) et a depuis été remplacée par C11 (2011). Avec une version récente (au moins la série 6) de gcc on compilera par défaut en mode C11 + extensions gnu. Si on ne désire pas les extensions alors il vaut mieux utiliser -std=c11.
    L'option -o ne sert qu'à donner le nom du fichier produit par la ligne de commande. Comme l'option [-c] va par défaut choisir un nom de fichier identique au source avec un remplacement d'un .c terminal par un .o, cette option n'est pas nécessaire ici.

    L'ordre des options est parfois importante (au moment du link l'ordre des bibliothèques), parfois pas (emplacement du -o).
    Ce qui est en revanche important quand on utilise un makefile, c'est d'utiliser les règles par défaut qui sont bien foutues. Il suffit de donner les bonnes valeurs à quelques variables pour avoir un makefile qui met tout au bon endroit. Par exemple tu aurais pu avoir un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CC=gcc # on donne l'exécutable du compilo c
    CPPFLAGS= # les options pour le préprocesseur -I par exemple
    CFLAGS=-Wall -Wextra -g # les options à donner au compilo c
    LDFLAGS= # les options du linker -L par exemple
    LDLIBS= #les bibliothèques à lier -l par exemple
     
    hello.o: hello.c hello.c structure.h
     
    structure.o: structure.c structure.h
     
    mon_application: hello.o structure.o

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 428
    Points : 170
    Points
    170
    Par défaut
    Merci picodev pour tes explications.

    Comment tu fais pour mettre la norme C11 dans le makefile est-ce que tu fais -Wall -Wextra -g -C11 ?

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 428
    Points : 170
    Points
    170
    Par défaut
    Merci pour la réponse, -std=c11 marche.
    J'ai essayé avec un prog en C++ et quand je compile, la commande -std=c++11 n'est pas reconnu par le compilo .

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 428
    Points : 170
    Points
    170
    Par défaut
    En fait pour le c++ je doit mettre la norme c++98 et en faisant donc -std=c++98 ça marche

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Quelle version de gcc as tu ? Essaye -std=c++1x pour voir.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 428
    Points : 170
    Points
    170
    Par défaut
    Voici ma version de gcc :

    Nom : gcc version.jpg
Affichages : 394
Taille : 84,6 Ko

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hbx360 Voir le message
    Si je ne fait pas d'erreur quelle est l'intérêt de générer un exécutable de hello.o, puis de le retransformer en .o
    Ben en fait tu fais erreur. Tu ne retransformes rien en "hello.o"

    Citation Envoyé par hbx360 Voir le message
    Je trouve plus logique la première : on dit avec quel compilateur on va compiler (ici gcc)
    On le dit aussi dans la seconde !!!
    Citation Envoyé par hbx360 Voir le message
    ensuite on mets -c pour créer le fichier .o...
    Pourquoi tu ne commences pas par lire une doc ou un tuto ???

    Voic l'explication des syntaxes:
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    structure.o : structure.c
        gcc -c -Wall structure.c
     
    hello.o: hello.c
    	gcc -o hello.o -c hello.c -W -Wall -ansi -pedantic

    Chaque groupe commence par une étiquette "cible: origine". Ca permet de créer une règle indiquant comment créer la cible à partir de l'origine
    Secondes (et éventuellement lignes suivantes devant toutes commencer impérativement par une tabulation); indique les opération à effectuer pour créer la cible à partir de la source. Pour la première dépendance (création de structure.o à partir de structure.c), ces opérations seront d'appeler "gcc" avec certaines options (dont l'une "-c" sera de demander juste la compilation sans créer l'exécutable).
    Et pour la seconde dépendance (création de hello.o à partir de hello.c), ces opérations seront d'appeler là aussi "gcc" avec là aussi certaines options dont l'une est de demander la sortie (-o) dans le fichier "hello.o" (ce qui est facultatif car c'est ce qui se ferait par défaut comme on peut le voir dans le premier groupe).

    Citation Envoyé par hbx360 Voir le message
    Pourquoi il y a une différence entre les deux.
    Ben comme tu vois, les différences sont minimes et se situent en fait sur des options facultatives. Donc c'est un peu comme si tu demandais "pourquoi taper parfois ls -l et parfois ls -lt..."
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hbx360 Voir le message
    Voici ma version de gcc :

    Nom : gcc version.jpg
Affichages : 394
Taille : 84,6 Ko
    Que dire ?.......

    Lis-tu ce que tu as écrit et ce que t'affiche ton terminal ? Tu ne tapes pas la bonne option pour demander à ton compilateur d'utiliser le C++11, tu ne demandes pas la version de gcc mais de which. Et tu n'essayes pas l'option que je te propose.

    Tu ne peux pas faire l'économie de comprendre les actions que tu fais ni de comprendre les réponses de ton ordinateur.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 428
    Points : 170
    Points
    170
    Par défaut
    @Sve@r : merci pour tes explications. J'y vois plus claire.

    @Bktero : en faite ma version de g++ c'est la version 2.2.
    Si je mets -std=c++98 ça marche car je n'ai pas la version supérieur de g++.
    Il me semblait quand faisant which g++ g++ --version ou bien which gcc gcc --version j'obtiendrai la version de gnu gcc ou g++.

  12. #12
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Tu ne peux pas (bon....c'est techniquement possible mais tellement improbable qu'on dira que c'est impossible) avoir la version 2.2 de gcc... On est en à la version 6.x et les versions 4.x ont déjà au moins 5 ans. D'ailleurs, regarde ce que te retourne ta commande : "GNU Which v2.20". Si tu demandais vraiment la version de gcc, tu verrais ceci :
    $ gcc --version
    gcc (GCC) 5.3.0
    Copyright (C) 2015 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    $ g++ --version
    g++ (GCC) 5.3.0
    Copyright (C) 2015 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    A comparer avec :
    which --version
    GNU which v2.21, Copyright (C) 1999 - 2015 Carlo Wood.
    GNU which comes with ABSOLUTELY NO WARRANTY;
    This program is free software; your freedom to use, change
    and distribute this program is protected by the GPL.
    Tu as peut-être mal compris à quoi sert la commande which. Elle permet de localiser une commande, elle ne donne donc qu'un chemin vers le programma dans le système de fichiers et non des détails sur le programme lui. Voir la page de documentation de la commande : http://pwet.fr/man/linux/commandes/which

    Enfin, je le redis et je vais le mettre en gros et en couleur: l'option n'est pas -c++11 mais -std=c++11 !!!
    $ g++ -c main.cpp -Wall -Wextra -std=c++11
    
    $ g++ -c main.cpp -Wall -Wextra -c++11
    g++: error: unrecognized command line option '-c++11'

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 428
    Points : 170
    Points
    170
    Par défaut
    Ok merci à toi Bktero pour ton aide et tes éclaircissement. Je pense avoir compris.

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

Discussions similaires

  1. Plusieurs questions sur les connexions
    Par Vince7-7 dans le forum Informatica
    Réponses: 1
    Dernier message: 28/12/2011, 23h25
  2. Réponses: 51
    Dernier message: 20/10/2006, 17h52
  3. plusieurs questions sur les Dll
    Par mnaulet dans le forum Windows
    Réponses: 4
    Dernier message: 07/08/2006, 09h39
  4. Réponses: 4
    Dernier message: 11/09/2004, 17h38
  5. question sur les erreurs de compilation
    Par vince3320 dans le forum C
    Réponses: 5
    Dernier message: 19/04/2004, 12h34

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