2
votes

Utilisation de% .o:% .c dans makefile

J'ai ce makefile:

CC = gcc
CFLAGS = -std=c99 -W -Wall
CFLAGSS = -std=c99 -W
LIBS = -lm

prog : main.o double.o coord2D.o coord3D.o
    $(CC) $^ $(LIBS) -o $@

%.o : %.c
    $(CC) $(CFLAGS) $< -c

coord2D.o: coord2D.c coord2D.h double.h
coord3D.o: coord3D.c coord3D.h double.h
double.o: double.c double.h
main.o: main.c double.h coord2D.h coord3D.h

Ma question:
Que fait la ligne «% .o:% .c»?

Où je suis:
J'ai fait beaucoup de recherches, mais je ne sais toujours pas exactement comment cela fonctionne.
D'après ce que j'ai appris, lorsque nous tapons "make":
- on passe à la première règle "prog" qui contient la dépendance "main.o"
- à cause de cela, on passe à la règle "main.o" qui est reconnue par "% .o:% .c" car elle contient le pattern "main.o: main.c" et compilée.
- nous retournons ensuite à "prog", qui contient "double.o" et nous répétons les étapes

Est-ce ainsi que ça marche? Si oui, j'ai une deuxième question: et si nous écrivons "% .o:% .c coord2D.h double.h"? Prendra-t-il seulement la règle "main.o" en considération car c'est la seule qui contient un fichier ".c" et les deux fichiers ".h"?


2 commentaires

Lisez Utilisation de règles implicites dans le manuel GNU Make


vous voudrez probablement regarder les 'fichiers de dépendance' Comment les créer à la volée, comment les utiliser, etc.


3 Réponses :


0
votes

Oui, c'est ainsi que variables spécifiques au modèle travail. Quant à votre deuxième question, non - les deux règles s'appliqueront (mais sans les règles de modèle statique et aucun fichier .h , Make utiliserait un règle implicite ).


0 commentaires

0
votes

La plupart des réponses à votre question sont ici - Plusieurs règles pour une seule cible .

Veuillez le lire, il est court et contient des exemples, mais l'essentiel est:

Un fichier peut être la cible de plusieurs règles. Tous les prérequis mentionnés dans toutes les règles sont fusionnés en une seule liste de prérequis pour la cible.

Donc, si vous avez une cible particulière comme "coord2D.o", il prend toutes les règles là où le côté gauche correspond, et combine tous les côtés droits.

Notez que dans ce cas, une seule règle peut avoir une recette (comme la commande $ (CC) dans votre cas), toutes les autres sont vides et sont utilisées pour simplement diviser la déclaration des dépendances entre plusieurs lignes.

Dans votre cas, vous pourriez éviter de mentionner coord2D.c et d'autres fichiers C dans des règles supplémentaires, car il est déjà couvert par % .c . Vous pouvez également déplacer la dépendance commune double.h vers la règle commune % .o pour éviter les répétitions.

Il existe également une fonction pour générer les règles de dépendance du fichier d'en-tête décrit ici , bien qu'il soit avancé et un peu compliqué.


2 commentaires

Salut, je me demande juste ..% considère automatiquement tous les fichiers du dossier actuel ou dois-je le donner avec make


Je pense que oui. Devrait être facile à essayer? Consultez également cette page: gnu.org / software / make / manual / html_node /…



1
votes

La réponse simple est que% .o est une cible qui correspond à tout fichier se terminant par .o.

"% .o:% .c" signifie que tout fichier se terminant par .o dépend du même nom de fichier se terminant par .c pour être présent.

La ligne suivante, commençant par une tabulation, est la règle à utiliser chaque fois que vous générez un fichier de la forme% .o. Ainsi, par exemple:

L'exécutable "prog" nécessite que "main.o" soit construit (ligne 6). make recherche une règle pour construire main.o - il en trouve deux:

  1. La règle la plus spécifique (spécifiant le nom du fichier par son nom):
gcc main.o double.o coord2D.o coord3D.o -lm -o prog

Cette règle spécifie toutes les dépendances pour main.o. Une conséquence de ceci est que main.o sera recompilé si l'un de ces fichiers est plus récent que main.o (c'est-à-dire qu'il a été modifié entre-temps)

  1. La règle générale:
    %.o: %.c
             $(CC) $(CFLAGS) $< -c

Cela exécutera la commande "gcc -std = c99 -W -Wall main.c -c "$

Les autres jokers dans les autres lignes ici sont "$ @ "(incluez la cible ici) et $ ^ (incluez la liste complète des prérequis ici). La commande pour prog sera étendue à:

    main.o: main.c double.h coord2D.h coord3D.h

Les règles génériques comme celle-ci vous permettent de créer des projets complexes avec très peu de règles.


0 commentaires