Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 17/12/2007, à 15:09

Foussa

Utilisation Makefile pour compiler des programmes en C

voilà ,
je n'ai jamais fait de makefile. J'ai cherché de la documentation sur internet, mais j'ai du mal à  faire un makefile qui fonctionne !

voici ce que j'aimerais que mon makefile fasse.

Je dois compiler 3 fichiers en C
main.c
seveur.c
client.c

pour en faire des .o

pour l'instant, je fais cela avec les 3 commandes
$ gcc -o main.o main.c
$ gcc -o serveur.o serveur.c
$ gcc -o client.o client.c

puis je lance le main avec la commande
$ ./main.o


comment faire mon Makefile pour que les 3 fichiers soient compilé lors du make ?

merci

Hors ligne

#2 Le 17/12/2007, à 16:17

LittleWhite

Re : Utilisation Makefile pour compiler des programmes en C

Pour le makefile tu peux le faire comme cela :

Pour le makefile tu peux enlever tout ce qui est après le '#' ( c'est du commentaire )

#On cree des balises pour aller plus vite
CC = gcc                                                       # Le compilateur
CFLAGS = -Wall -ansi -g -pedantic -ansi      # les drapeaux de compilation
LDFLAGS = -lm                                              # Les bibliothèques ( -lm pour l'exemple je ne crois pas que ce soit utile pour toi )

all: main.o serveur.o client.o # Il appelle les lignes correspondantes ( celles au dessus ) 
# règle prise en compte quand tu tape make ( car elle est en première ) ou make all

main.o: main.c
               $(CC) $(CFLAGS) -c main.c -o main.o   # ici c'est une tabulation avec $(CC)
serveur.o: serveur.c
               $(CC) $(CFLAGS) -c serveur.c -o serveur.o
client.o: client.c
               $(CC) $(CFLAGS) -c client.c -o client.o

clean:
               rm *.o # c'est une tabulation avant rm ; règle applqué quand tu fais make clean


Mais je voudrai juste te dire un truc c'est que tu ne peux pas executer un .o .
Après avoir fais le .o tu dois faire :  gcc main.o -o main ( pour avoir un executable )
Normalement le makefile fait directement des executables en rajoutant pour avoir un main qui est executable ( faire des lignes identiques pour le serveur et le client en remplaçant main par client ou serveur ). Après tu rajoute dans le all, client et serveur :

main: main.o
              $(CC) $(LDFLAGS) main.o -o main

all: main # car tu appelle directement la ligne de main qui appelera la ligne du main.o

Si tu as besoin de plus de précision demande nous.

Dernière modification par LittleWhite (Le 17/12/2007, à 16:22)


Linux ou mourir
Pour avoir des problemes : demarrer Windows
Script de compression multi archive : http://forum.ubuntu-fr.org/viewtopic.php?id=225297

Hors ligne

#3 Le 17/12/2007, à 16:30

Foussa

Re : Utilisation Makefile pour compiler des programmes en C

ok, je vois mieux comment ça fonctionne, merci wink


par contre, il me met des erreur lorsque je veux mettre un commentaire avec le "//" et d'autres petites erreurs,
je suppose que c'est à  cause des drapeaux de compilations, mais je ne sais pas lesquelles utiliser pour mon porgramme


quand je mets les drapeaux en commentaire, ça passe ...


et comment faire pour faire un exécutable alors ?

Dernière modification par Foussa (Le 17/12/2007, à 16:40)

Hors ligne

#4 Le 18/12/2007, à 01:58

Zoltan_K

Re : Utilisation Makefile pour compiler des programmes en C

Salut !

Un petit exemple de makefile (je vais essayer de l'expliquer au fur et a mesure) :

# On commence a definir les variables du Makefile
NAME = mon_prog     # Le nom du prog que tu veux

CC = gcc                 # Le compilateur que tu veux utiliser

SRC = main.c \          # Tu mets tous tes fichiers source
         serveur.c \
         client.c

OBJ = $(SRC:.c=.o)   # Transforme tes fichiers sources en .o

CFLAGS = -W -Wall -pedantic -ansi  # Toutes les options avec lesquelles tu veux compiler

# On definit ensuite les regles du Makefile
all : $(OBJ)  #Voir les explications ensuite
      $(CC) -o $(NAME) $(OBJ)

clean :
      rm -f *~
      rm -f \#*#
      rm -f $(OBJ)

fclean : clean
      rm -f $(NAME)

re : fclean all

Et c'est bon ! Ensuite, tu tapes dans une console :

$>make la_regle_que_tu_veux

All etant la regle par defaut.

Biensur, ca te permet de compiler seulement des programmes en console "de base" mais c'est un bon debut de Makefile
Le fait de mettre la variable $(OBJ) comme dependence de la regle 'all' permet de reconstruire en .o seulement les sources qui ont ete modifiees depuis la derniere compilation.
(Sur un petit projet, la difference ne se sent pas mais sur un gros proj, ca devient tres utile !)
Sinon, si aucun .o n'est present dans le dossier, ils seront tous reconstruits automatiquement.

Pour les CFALGS, pas besoin de les ajouter a la regle 'all', ils sont automatiquement ajoutes
lors de la compilation.
Je te conseille VIVEMENT de mettre au minimum '-W -Wall -ansi -pedantic' ! Ce sont des warnings qui te diront s'il y a une erreur dans ton code. L'option -g sert seulement au debugage.
Libre a toi d'en rajouter d'autres, mais pour savoir lesquelles, une seule solution : man gcc ! big_smile (et il est costaud !)

Pour ce qui est de l'erreur sur les commentaires, c'est l'option -ansi ou -pedantic (je sais plus laquelle) qui ne supporte que les commentaires de la forme /* ... */ et pas les '//'...

Tu as normalement tous les elements pour faire un makefile correct.
En esperant ne pas avoir ete trop obscur dans mes explications,
Bonne soiree a tous !

ps : desole pour les accents mais y'en a pas sur les qwerty...


Que cherchait à faire l'Homme quand il a découvert que la vache donnait du lait ?

Hors ligne

#5 Le 18/12/2007, à 12:22

LittleWhite

Re : Utilisation Makefile pour compiler des programmes en C

Pour les "//" c'est -ansi donc tu peux l'enlever parce que d'une part c'est ch... mais au sinon ça fait classe de faire un  programme qui compile sans warnings avec des -ansi -pedantic
-O2 pour les optimsation ( mais bon enfin là c'est exagéré car c'est juste pour optimisé ; c'est pas très important pour les petit programme )
le -W est inutile lorsque tu met -Wall car d'après moi le -Wall comprend les flags de -W

Cool pas d'accent sur les claviers QWERTY tu as une excuse correct pour ne pas les mettres ( Il me faut donc le même clavier )
mais on peut les mettre même sur le QWERTY big_smile


Linux ou mourir
Pour avoir des problemes : demarrer Windows
Script de compression multi archive : http://forum.ubuntu-fr.org/viewtopic.php?id=225297

Hors ligne