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)