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 :

Compilation


Sujet :

Linux

  1. #1
    Provisoirement toléré
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Points : 33
    Points
    33
    Par défaut Compilation
    Bonsoir , je viens de créer un programme en C qui affiche l'alphabet , le programme est composé de 2 fichiers , un main.c , et un 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #include <stdio.h>
    int my_alphabet1()
    int main(void)
     
    {
     
    my_alphabet1()
     
    return 0;
     
    }
     
     
     
    et :
     
    int my_alphabet1()
     
    {
     
    char c;
     
    for ( c = 'a'; c <= 'z'; ++c)
     
    putchar(c);
     
    }
    pour les compiler ensemble , je dois faire un makefile , je veux que les fichiers compilent normalement ensemble , sans complication , comment réaliser ceci ? merci de votre aide .

    PS : j'ai déjà lu le tuto du site sur les makefile mais je n'ai pas vraiment compris .

  2. #2
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Voici mon patron de base si ca peut aider

    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
    #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: fichier1.c fichier2.c
    	$(CC) $(CFLAGS) -c fichier1.c fichier2.c
    	$(CC) $(LDFLAGS) -o test fichier1.o fichier2.o
     
     
    #nettoyage...
    clean:
    	rm -f *.o *~ core test

  3. #3
    Provisoirement toléré
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Points : 33
    Points
    33
    Par défaut
    merci mais pourrais tu m'expliquer ce que sont les drapeaux , drapeaux de link , la structure du fichier , parce que je nage totalement meme en lisant les tutos

    $(CC) $(CFLAGS) -c fichier1.c fichier2.c

    cette ligne aussi je ne la comprends pas du tout...

  4. #4
    Provisoirement toléré
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Points : 33
    Points
    33
    Par défaut
    ton makefile a l'air tt de meme gros , je voulais un makefile de débutant , minimale

  5. #5
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Pourtant, le tutorials sur les Makefile est super, bien fait, simple à comprendre, on ne peut pas faire mieux en la matière ! Si tu n'as rien compris à tout ce tutorial, c'est que tu n'as meme pas compris le concept meme des makefile !

    Si tu regardes bien le contenu du fichier tu peut décortiquer:

    $(CC) $(CFLAGS) -c fichier1.c fichier2.c :

    • $(CC) = appel de gcc
    • $(CFLAGS) = ici nous avons que des options de compilation concernant la prise en charge des erreurs soit: -Wall -W -pedantic. On peut très bien ajouter d'autre options, par exemple si on utilise une bibliothèque genre GTK, GLib ou autre
    • -c = bah compilation en fichiers objets des fichier: fichier1.c et fichier2.c


    Naturellement, dans le cas où tu ne l'avais pas compris, fichier1.c fichier2.c sont là que pour exemple, tu remplace leur nom par celui de tes fichiers, et si tu ajoute de nouveaux fichiers, tu n'as qu'a ajouter leur nom dans la liste !

    Mieux je peut pas, sinon relis le tutos du debut et là où tu coince bah pose alors tes questions !

  6. #6
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Bibouda
    ton makefile a l'air tt de meme gros , je voulais un makefile de débutant , minimale
    Bah pourtant c'est un minimum à avoir, et celui-ci tu peut l'agrandir simplement en ajoutant, sans modifier le reste ! Si tu veut un makefile minimum, bah sur ta ligne de commande tape: gcc main.c my_alphabet1.c -o ton_prog

  7. #7
    Provisoirement toléré
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Points : 33
    Points
    33
    Par défaut
    j'ai recopié mot pour mot ton makefile , et en tapant make dans le shell j'ai ceci :

    (CC) (CFLAGS) -c main.c my_alphabet.c ( au passage moi c'était my_alphabet1.c , mais j'ai aussi un my_alphabet , alors pq il me met celui là ! )
    /bin/sh: -c: line 0: syntax error near unexpected token (

    /bin/sh: -c: line 0: (CC) (CFLAGS) -c main.c my_alphabet.c
    make: *** [test] Erreur 2

    puis certaines lignes ne sont pas claires : déjà qu'est ce que c'est un drapeau , ensuite les liens de drapeau c'est quoi?

    j'ai l'impression qu'il a 2 parties dans ton makefile , une pour déclarer des variables , et une autre pour construire le programme


    clean: ... je suppose que c'est pour pas que les fichiers.o s'affichent dans le repertoire et aussi pour que les fichiers de backup soient supprimés , mais le core teste veut dire quoi?

    pour construire un programme faut tjs écrire all: nom du programme?

    -c = bah compilation en fichiers objets des fichier: fichier1.c et fichier2.c

    donc -c est l'option pour convertir les .c en .o , mais alors cette ligne elle veut dire quoi?

    $(CC) $(LDFLAGS) -o test fichier1.o fichier2.o

    tu vois çà te semble peut etre clair mais moi en lisant le tuto sur le site je ne vois pas le rapport entre ton makefile et le cours ...

    merci de tes précisions

  8. #8
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Bibouda
    (CC) (CFLAGS) -c main.c my_alphabet.c ( au passage moi c'était my_alphabet1.c , mais j'ai aussi un my_alphabet , alors pq il me met celui là ! )
    A toi de changer alors en my_alphabet1.c dans le makefile !

    Citation Envoyé par Bibouda
    puis certaines lignes ne sont pas claires : déjà qu'est ce que c'est un drapeau , ensuite les liens de drapeau c'est quoi?
    Options de compilation si tu préfères:

    • CFLAGS = options pour le compilateur (cc)
    • LDFLAGS = options pour le linker (ld)


    Citation Envoyé par Bibouda
    j'ai l'impression qu'il a 2 parties dans ton makefile , une pour déclarer des variables , et une autre pour construire le programme
    Tout à fait, dans la première partie tu définis tes variables, les flags pour le compilateur, le linker. On peut même ajouter des variables pour les fichiers source (*.c) et les fichiers objets (*.o) pour éviter de les taper dans chaque étapes de la compilation !

    Citation Envoyé par Bibouda
    clean: ... je suppose que c'est pour pas que les fichiers.o s'affichent dans le repertoire et aussi pour que les fichiers de backup soient supprimés , mais le core teste veut dire quoi?
    C'est la partie de nettoyage donc suppression de certains fichiers. Le mot "test" que tu vois, c'est le nom du fichier binaire (elf ou exe) généré comme tu peut le voir dans cette partie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #on construit le programme
    all: test
    Un fichier "core" s'est un fichier produit par Linux lorsque ton application à planté, ceci peut etre pratique pour le deboguage !
    Donc, si tu veut recompiler tout le programme, tu peut appeler la partie de nettoyage pour supprimer les fichiers objets et le fichier binaire voir le fichier core si y'en a comme ceci:

    et une fois ceci fait, tu peut recompiler en appelant make normalement !

    Citation Envoyé par Bibouda
    pour construire un programme faut tjs écrire all: nom du programme?
    Je pense que c'est préférable, il y'a surement encore d'autre méthodes mais c'est celle-ci que j'ai appris et je pense qui est la plus utilisée !

    Citation Envoyé par Bibouda
    -c = bah compilation en fichiers objets des fichier: fichier1.c et fichier2.c

    donc -c est l'option pour convertir les .c en .o , mais alors cette ligne elle veut dire quoi?

    $(CC) $(LDFLAGS) -o test fichier1.o fichier2.o
    La compilation se fait en plusieures étapes, d'abord la compilation (-c) puis l'édition des liens (-o) donc en somme, l'édition de liens c'est la partie où le linker assemble les différents fichiers objets dans un unique fichier ici nommé "test" donc le fichier binaire final !


    Voilà, j'espère que ces réponses te conviendrons ceci dit, je ne suis pas le plus grand expert en la matière. Pour des informations plus poussées, soit se référer au tutorial qui est super bien fait et est très clair ... dur de faire mieux je pense ou attendre que quelqu'un d'autre réponde

  9. #9
    Provisoirement toléré
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Points : 33
    Points
    33
    Par défaut
    tes réponses sont absolument parfaites , tout est clair maintenant , ceci dit j'ai tjs mon message d'erreur en tapant make

    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
       $(CC) $(CFLAGS) -c main.c my_alphabet1.c
       $(CC) $(LDFLAGS) -o test main.o my_alphabet1.o
     
     
    #nettoyage...
    clean:
       rm -f *.o *~ core test
    (CC) (CFLAGS) -c main.c my_alphabet1.c
    /bin/sh: -c: line 0: syntax error near unexpected token (

    /bin/sh: -c: line 0: (CC) (CFLAGS) -c main.c my_alphabet.c
    make: *** [test] Erreur 2

  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 : 47
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Je ne saurais te répondre là moi je viens tout juste de tester pour voir mais je n'est aucune erreur. Déjà ce que je trouve bizarre, c'est qu'il te fasses ch*** avec my_alphabet.c alors que tu utilise my_alphabet1.c !

  11. #11
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Pour infos, voici une autre manière de faire avec les makefile, en utilisant un maximum de variables, c'est plus pratique comme ca:

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #
    # Les variables...
    #
     
    #compilateur
    CC=gcc
     
    #fichier binaire
    BIN=test
     
    #fichiers sources
    SRC=main.c directory.c
     
    #fichiers objets
    OBJ=main.o directory.o
     
     
     
     
    #
    # Les flags...
    #
     
    #flags d'erreurs
    ERROR_CFLAGS = -Wall -W -pedantic
     
     
    #on indique quelques drapeux passes au compilateur
    CFLAGS=$(ERROR_FLAGS)
     
     
    #on indique quelques drapeux passes a l'editeur de liens
    LDFLAGS=$(ERROR_FLAGS)
     
     
     
     
    #
    # Regles de compilation...
    #
     
    #on construit le programme
    all: $(BIN)
     
     
    #compilation des fichiers
    test: main.c directory.c
    	$(CC) $(CFLAGS) -c $(SRC)
    	$(CC) $(LDFLAGS) -o $(BIN) $(OBJ)
     
     
     
     
    #
    # Fonctions de nettoyage...
    #
     
    #nettoyage...
    clean:
    	rm -f *.o *~ core $(BIN)

  12. #12
    Provisoirement toléré
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Points : 33
    Points
    33
    Par défaut
    c'est peut etre un problèùe de tabulations , dans ton 1er makefile , où as tu positionné exactement des tabulations?

  13. #13
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 816
    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 816
    Points : 7 648
    Points
    7 648
    Par défaut
    Salut,

    Citation Envoyé par Bibouda
    c'est peut etre un problèùe de tabulations , dans ton 1er makefile , où as tu positionné exactement des tabulations?
    C'est marqué dans le tutorial de gl ()

    Devant chaque commande tu dois mettre une tabulation, donc dans l'exemple donné par CSoldier, devant chaque ligne commençant par $(CC)

Discussions similaires

  1. Réponses: 15
    Dernier message: 10/10/2002, 20h19
  2. [Installation] Borland Compiler 5.5 sous XP
    Par Ligey dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 28/09/2002, 23h45
  3. dans le fond, la compilation...
    Par deltapositive dans le forum C++Builder
    Réponses: 5
    Dernier message: 17/09/2002, 13h14
  4. Vitesse de compilation
    Par srvremi dans le forum C++Builder
    Réponses: 5
    Dernier message: 30/07/2002, 17h49
  5. Réponses: 1
    Dernier message: 27/05/2002, 02h44

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