S'il vous plaît considérer le Makefile suivant:gnu faire: match quoi que ce soit: Dependance sur l'existence de conditions préalables
CC = g++
CFLAGS = -c -O -Wall
EFLAGS = -O -Wall -lm -o
UTILITIES = error.o stream_manip.o mat_ops.o GaussElim.o
UTILITIES += abstractmatrix.o dvector.o dmatrix.o ConjGrad.o
# All objects
%.o: %.cpp %.hpp
$(CC) $(CFLAGS) $<
# Executables (doesn't have extension)
% : %.cpp $(UTILITIES)
$(CC) $(EFLAGS) % $< $(UTILITIES)
# Specific executable
#TS_CG : TS_CG.cpp $(UTILITIES)
#$(CC) $(EFLAGS) [email protected] [email protected] $(UTILITIES)
La règle match quoi que ce soit (pour executables) est censé me permettre de taper ce qui suit dans un terminal:
make TS_CG
et ont faire compiler l'exécutable appelé TS_CG. Cependant, make
n'utilise pas ma cible de recherche universelle. Au lieu de cela, il utilise sa règle de compilation par défaut. D'autre part, si tous les objets répertoriés dans UTILITIES existent, il utilise ma cible de correspondance générale. Il semble donc que l'appariement dépend de l'existence des prérequis.
Apparemment:
Lorsqu'une règle est en phase terminale, il ne s'applique pas à moins que ses conditions préalables existent réellement.
(selon make manual). Mais ma règle n'est pas terminale; il n'est pas marqué par un double colon!
Alors, pourquoi cela semble-t-il toujours s'appliquer?
Je pourrais également demander si quelqu'un a une meilleure solution pour différencier les cibles d'objets et les cibles exécutables, comme j'ai essayé de le faire dans mon fichier.
Merci pour votre réponse Bêta, que je suppose est la bonne réponse. Cela semble contraire à ce qui a été cité dans le manuel make de mon article, mais je suppose que c'est parce que la règle intégrée n'est pas écrasée par ma règle (ce que je pensais que ce serait). – Patrick