je doit rendre un projet de C en cours d´info.
tous les fichiers sources sont finis, le prog fonctionne impecablement.
mais on me demande en plus un Makefile.
ne sachant pas ce que c´est, je cherche dans mon cours mais je n´ai pas très bien compris a quoi ça servait et encore moins comment ça fonctionne.
d´apres ce que je pense avoir compris ça sert a compiler les fichiers separement ce qui permet de ne recompiler que les fichiers modifiés depuis la derniere compilation.
alors voici la liste des fichiers que j´ai créé:
-calculatrice.c / /prog principal
-eval.h
-eval.c
-pile.h
-pile.c
-operation.h
-operation.c
je vous met les différentes relation entres les fichiers
calculatrice.c inclus eval.h
eval.c inclus pile.h et operation.h
operation.c inclus pile.h
pour compiler mon prog je ne compile que calculatrice.c
je ne sait pas si cela vous suffit comme présentation de mon pb
si c´est le cas je voudrait savoir a quoi doit ressembler mon fichier makefile.
merci
Un makefile ca sert d´un maniere generale a construire quelquechose a partir de regles.
Tu donne ton objet a construire, les trucs dont il depends et les regles pour construire des trucs. Je dis " trucs" car ca peut etre n´importe quoi.
Le makefile doit etre ecrit dans une syntaxe particuliere ( regarde dans tes cours) et c´est la meme pour toutes les machines.
Le makefile verifie en effet les dates des fichiers et lorsque la source d´un truc n´a pas changé, il ne le reconstruit pas.
Voici un makefile que j´ai utilise pour GBA :
CFLAGS = -c -O3
MODEL = -mthumb -mthumb-interwork
all : TankZone.bin
TankZone.bin: TankZone.elf
objcopy -O binary TankZone.elf TankZone.bin
TankZone.elf : main.o
gcc $(MODEL) -o TankZone.elf main.o
main.o : main.c
gcc $(CFLAGS) $(MODEL) main.c
( il faut mettre des espace, mais ce forum a la noix les as tous bouffés).
Je vais mettre des _ a la place
CFLAGS = -c -O3
MODEL = -mthumb -mthumb-interwork
all : TankZone.bin
TankZone.bin: TankZone.elf
_objcopy -O binary TankZone.elf TankZone.bin
TankZone.elf : main.o
_gcc $(MODEL) -o TankZone.elf main.o
main.o : main.c
_gcc $(CFLAGS) $(MODEL) main.c
Pour les . h, ca intervient pas dans le makefile. Le . h est juste une partie du fichier C, le compilo considere ca comme un seul fichier, car il " include" le texte du . h.
Le makefile mets en relation l´objet compilé ( le fichier . o) et le fichier source ( .c).
ok merci je vais voir avec ce que j´ai ce que sa pourait donner.
alors j´ai réussi a faire un truc qui fonctionne
je te met ce que j´ai ecrit dans mon makefile.
calc: calculatrice.c eval.c eval.h pile.c pile.h operation.c operation.h
_gcc -Wall -o calc calculatrice.c
avec une tabulation a la place de _
mais je ne vois pas en quoi ces 2 lignes ( la 1ere commence par " calc" et la seconde par " _gcc" je te met ça car j´imagine que sur le forum ça va apparaitre sur 3 lignes) permetent de faciliter la compilation.
alors soit tout est bien et c´est ça qu´il faut faire soit le truc que j´ai tapé est bidon mais fonctionne quand meme....
autre interogation:
chez moi je compile en tapant:
gcc -Wall -o calc calculatrice.c
et a la fac ( sous linux) il faut rajouter la comande -lm si on veut utiliser sqrt.
pourquoi donc ( j´imagine que ça doit vouloir dir un truc du genre link math.h).
Si je me rappelle bien, pour compiler le projet en utilisant le makefile, il faut ecrire " make" dans la ligne de commande.
Pour le -lm - sous linux, c´est pour appeller math.lib car même si tu as bien appellé " #include < math.h>" ( prototypages) dans ton source, il faut utiliser la librairie où se trouvent le corps des fonctions.
La doc de make est tres bien faite. Avec un peu d entrainement, tu arriveras a faire un makefile sans avoir a rentrer les differents fichiers . o, et qui reussira a determiner les dependances lorsque tu le lui demande.
/ kUfa
franco01 Posté le 10 mai 2005 à 10:00:13
>Si je me rappelle bien, pour compiler le projet en utilisant le makefile, il faut ecrire " make" dans la ligne de commande
ça c´est bon j´avais compris; mais ce que je voudrait savoir c´est si les 2 lignes que j´ai tapées permettent au compilo de savoir quels fichiers ont été modifiés depuis la derniere compilation et quels autres sont restés inchangés.
il me semble que pour le moment le seul interet de mon makefile est que pour compiler je gagne 20 caracteres sur la ligne de comande ( "make" au lieu de " gcc -Wall -lm -o calc calculatrice.c")
j´ai commencé a faire des fichiers . o
de la maniere suivante.
calc : calculatrice.o eval.o pile.o operation.o
gcc -Wall -o calc calculatrice.o eval.o pile.o operation.o
calclculatrice.o : calculatrice.c
gcc -c calculatrice.c
eval.o : eval.h eval.c
gcc -c eval.c
operation.o : operation.c operation.h
gcc -c operation.c
pile.o : pile.c pile.h
gcc -c pile.c
clean :
rm -f *.o
===========
mais lorsque je tape " make" j´ai des message d´erreur qui me dise que je déclare plusieur fois des fonctions.
je supose que ça vient du fait que
-operation.c inclus pile.h
-eval.c inclus pile.h et operation.h
-calculatrice.c inclus eval.h
si c´est ça comment faire pour que les fichiers ne soit inclus qu´une seul fois
( un truc un peu dans le genre
. .. le corp de pile.h
que j´ai utilisé dans chaque fichier . h pour qu´il ne soit inclus qu´une fois lorsque je compile calculatrice.c)
? ?
merci
Ton makefile a l´air correct.
Attention de verifier d´ou viennent tes erreurs. Du makefile ou des commandes gcc executées ? ?
les erreurs viennent des commandes gcc.
en fait je me suis trompé:
dans mes fichiers sources au lieu de faire appel aux fichiers . h j´inclus les fichiers . c
ça marche impec mais ce n´est pas comme ça qu´il faut faire ( sinon les fichiers . h ne servent a rien)
quand j´inclus un fichier . h et que je compile ce dernier est ignoré et le compilo ne trouve pas les fonctions qui y sont definies.
alors que si j´inclus les fichiers . c ça marche.
? ??
( j´ai verifié et j´ai bien le meme type de syntaxe que pour l´inclusion de NGCK.h dans les projet que tu distribues dans le topic methode d´aprentissage)
je me suis renseigné a la fac cet après midi et un gars m´a dit qu´il avait le meme prob chez lui sur dev-cpp et que pour inclure des fichiers . h il fallait faire un " projet" avec dev-cpp. mais que sous linux ce n´était pas necessaire.
exemple pour ( un poil) plus de clareté:
la fct multiplication et contenue et define dans operation.c
fichier principal:
======
int main()
{
int x;
x=multiplication(5,7);
printf("%d\n",x);
return 0;
}
================
ceci ne fonctionne pas
et renvoi comme erreur :
multiplication est inconnu
autre version ( qui fonctionne)
================
int main()
{
int x;
x=multiplication(5,7);
printf("%d\n",x);
return 0;
}
==============
je ne comprend pas pourquoi ça ne fonctionne pas alors que les fichiers operation.c et operation.h
sont correctements ecrits
je pense que c´est le meme genre d´erreur lors de l´execution du makefile.
je vais essayer tout ça sous linux demain a la fac.
merci de ta reponse.
Ton fichier . h ne doit pas etre correct. Il doit contenir le prototype de ta fonction multiplication, qui doit etre :
int mutltiplication(int a, int b);
c´est tout.
En incluant le fichier . c, la fonction devient bien definie, mais tu auras normallement une erreur de link, car ta fonction existera dans 2 fichiers . o differents.
non non mon fichiers . h est correct.
je vien de mettre tous mes fichiers sources ( sans les modifier) dans un projet dev-cpp et là . ... par le truchement de l´informatique pas de pb de compilation les lien se font de maniere correcte.
donc je vais continuer de suivre les conseils reçu a la fac en esperant que tout fonnctionne aussi bien sur les ordis de la fac. ( sous linux)
car je me vois mal rendre à mes profs un fichier projet dev-cpp.
y a t´il une explication pour le fait que dev-cpp compile correctement si c´est un projet complet et mal si c´est juste une liste de fichier . c
bon ce n´est plus la peine de me répondre j´ai fini par trouver une solution a mon pb en analysant le makefile produit par le projet dev-cpp
j´ai ensuite retapé mon propre makefile et un poil retouché mes fichiers sources ( surtout pour inclure < stdio.h> et < stdlib.h> partout)
et TADAAAAA ça marche impec ( et le tout avec une ecriture qui plaira aux profs....)
bon ben vu que ce topic ne me sert plus et que personne d´autre y venait tu peux le supprimer.
encore merci de ton aide.
Ben pourquoi ne pas mettre ici ton makefile final ? Ca pourra toujours aider un gars qui a le meme probleme que toi.
ok le voila.
calculatrice:calculatrice.o eval.o operation.o pile.o
_ gcc calculatrice.o eval.o operation.o pile.o -lm -o calculatrice
calculatrice.o: calculatrice.c
_ gcc -c calculatrice.c -o calculatrice.o
eval.o: eval.c
_ gcc -c eval.c -o eval.o
operation.o: operation.c
_ gcc -lm -c operation.c -o operation.o
pile.o: pile.c
_ gcc -c pile.c -o pile.o
clean :
_ rm -f calculatrice calculatrice.o eval.o operation.o pile.o
en fait en le relisant je me demande pourquoi j´ai pas réussi a l´ecrire du prmeir coup ( a moins que ce soit les 2-3 changement que j´ai fais sur les sources qui font que ça fonctionne???)
le mystère reste entier.
et vu que le makefile seule ne sert a rien je vous donne tous les fichiers necéssaires.
http://www.info.univ-angers.fr/pub/letouzey/C/
voila une belle page qui va rebuter tt le monde.