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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 447
    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 Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    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 éclairé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 447
    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
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 447
    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 éclairé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 447
    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
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    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]

+ 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, 22h25
  2. Réponses: 51
    Dernier message: 20/10/2006, 16h52
  3. plusieurs questions sur les Dll
    Par mnaulet dans le forum Windows
    Réponses: 4
    Dernier message: 07/08/2006, 08h39
  4. Réponses: 4
    Dernier message: 11/09/2004, 16h38
  5. question sur les erreurs de compilation
    Par vince3320 dans le forum C
    Réponses: 5
    Dernier message: 19/04/2004, 11h34

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