projtec:index
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| projtec:index [2016/09/12 19:11] – [Makefile] orel | projtec:index [2024/03/18 15:06] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 3: | Line 3: | ||
| //Vous trouverez sur ce wiki quelques notes personnelles sur l'UE Projets Technologiques en L2 Info.// | //Vous trouverez sur ce wiki quelques notes personnelles sur l'UE Projets Technologiques en L2 Info.// | ||
| - | __Site Web__ : https:// | + | * [[projtec:gcc | GCC ]] |
| + | * [[projtec:make | Makefile ]] | ||
| + | * [[projtec: | ||
| + | * [[projtec: | ||
| + | * [[projtec: | ||
| + | * [[projtec: | ||
| + | * [[projtec: | ||
| + | * [[projtec: | ||
| + | * [[projtec: | ||
| - | ====Compilation==== | ||
| - | //Ici, nous nous intéressons uniquement à la compilation de programme C99 sous Linux avec le compilateur GNU.// | ||
| - | |||
| - | Considérons un programme //hello.c// en un seul fichier. | ||
| - | |||
| - | <code c hello.c> | ||
| - | #include < | ||
| - | int main(int argc, char* argv[]) { | ||
| - | printf(" | ||
| - | return 0; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Pour rendre ce programme exécutable, | ||
| - | |||
| - | gcc -std=c99 hello.c -o hello # compilation | ||
| - | ./ | ||
| - | | ||
| - | En fait, la ligne de compilation précédente est un raccourci. En principe, on distingue deux étapes, la compilation des fichiers sources (.c) en fichier objet (.o) et l' | ||
| - | |||
| - | gcc -std=c99 -c hello.c | ||
| - | gcc hello.o -o hello # édition de lien (génère l' | ||
| - | | ||
| - | Supposons maintenant que notre programme se compose de plusieurs fichiers : le programme principal //toto.c// avec la fonction //main()// ainsi que plusieurs fichiers annexes //tutu.c// et //tata.c//. De plus, ce programme utilise la fonction //sqrt()// de la bibliothèque mathématique standard (libm.a). Pour compiler ce programme en ligne de commande, il faut d' | ||
| - | |||
| - | gcc -std=c99 -c toto.c tutu.c tata.c | ||
| - | | ||
| - | Puis, on réalise l' | ||
| - | |||
| - | gcc toto.o tutu.o tata.o -o toto -lm | ||
| - | |||
| - | Imaginons maintenant qu nous souhaitons regrouper les fichiers //tutu.c// et //tata.c// au sein d'une bibliothèque statique // | ||
| - | |||
| - | ar rcs libpouet.a tutu.o tata.o | ||
| - | | ||
| - | On peut ensuite utiliser cette bibliothèque pour la compilation avec l' | ||
| - | |||
| - | gcc toto.o -o toto -L. -lpouet -lm | ||
| - | | ||
| - | L' | ||
| - | |||
| - | |||
| - | |||
| - | ====Makefile==== | ||
| - | |||
| - | //Pour compiler automatiquement et efficacement un projet de programmation, | ||
| - | |||
| - | Un fichier // | ||
| - | |||
| - | cible1: dep1 dep2 dep3 ... | ||
| - | commande | ||
| - | |||
| - | Attention, il faut une tabulation avant d' | ||
| - | |||
| - | Notons que la commande n'est exécutée que si le fichier //cible1// n' | ||
| - | |||
| - | dep1: autredep1 autredep2 ... | ||
| - | autre_commande | ||
| - | | ||
| - | Au final, grâce à un chaînage précis des dépendances, | ||
| - | |||
| - | Voici un exemple type de fichier Makefile pour le programme C précédent. | ||
| - | |||
| - | <code bash Makefile> | ||
| - | # variable standard pour la compilation | ||
| - | CC=gcc | ||
| - | CFLAGS=-Wall -g -std=c99 | ||
| - | LDFLAGS=-L. -lm # options de link | ||
| - | CPPFLAGS= | ||
| - | |||
| - | # cible principale (par défaut) | ||
| - | all: toto | ||
| - | |||
| - | # règle spécifique pour générer l' | ||
| - | toto: toto.o tutu.o tata.o | ||
| - | $(CC) $^ -o $@ $(LDFLAGS) | ||
| - | |||
| - | # règle générique de compilation des fichiers C | ||
| - | %.o: %.c | ||
| - | $(CC) $(CFLAGS) -c $< -o $@ | ||
| - | |||
| - | .PHONY: clean | ||
| - | clean: | ||
| - | rm -f *.o *~ toto | ||
| - | </ | ||
| - | |||
| - | |||
| - | Dans ce Makefile, il y a quelques notions à comprendre : | ||
| - | |||
| - | * Les commentaires sont précédés du symbole #. | ||
| - | * La variable %%$%%@ représente la cible courante. | ||
| - | * La variable %%$%%^ représente la liste des dépendances. | ||
| - | * La variable %%$%%< représente la première dépendance. | ||
| - | * La cible .PHONY permet d' | ||
| - | |||
| - | Pour fabriquer une cible particulière, | ||
| - | |||
| - | <code bash> | ||
| - | $ make | ||
| - | gcc -Wall -g -std=c99 -c toto.c -o toto.o | ||
| - | gcc -Wall -g -std=c99 -c tutu.c -o tutu.o | ||
| - | gcc -Wall -g -std=c99 -c tata.c -o tata.o | ||
| - | gcc toto.o tutu.o tata.o -o toto -L. -lm | ||
| - | |||
| - | $ make clean | ||
| - | rm -f *.o *~ toto | ||
| - | </ | ||
| - | |||
| - | //Expliquer comment injecter automatiquement des dépendances complexes dans un Makefile grâce à l' | ||
projtec/index.1473707515.txt.gz · Last modified: 2024/03/18 15:05 (external edit)
