2017-06-02 1 views
-1

Premièrement - je sais qu'il y a beaucoup de discussions similaires à cela, mais j'ai passé des heures sans les travailler pour moi. Mon makefile crée d'abord un répertoire nommé par la date et l'heure actuelles. J'ai ensuite le makefile ajouter à un fichier d'en-tête une ligne qui crée une chaîne avec ce nom de répertoire. Pour cette raison, je dois d'abord copier tous les fichiers source (y compris l'en-tête) dans le sous-répertoire nouvellement créé, afin que je puisse conserver l'en-tête original et modifier seulement l'en-tête qui sera utilisé pour la compilation. Je voudrais ensuite construire dans ce nouveau répertoire.GNU make dans le sous-répertoire nouvellement créé

Mon problème est de faire make pour construire correctement les fichiers .o dans le nouveau sous-répertoire. La solution que j'ai trouvé est d'avoir

$(NOW)%.o: $(NOW)%.cpp $(CC) -c $(FLAGS) $<

$(NOW)$ est le nom sous-répertoire. Le problème est que mon $(FLAGS) semble être ignoré: la sortie est, à peu près

g++ -c -o <.o file> <.cpp file>

(Oui, il y a effectivement l'espace introduit supplémentaire entre g++ et -c.) Alors que la construction dans le répertoire de niveau supérieur à la

%.o: %.cpp $(CC) -c $(FLAGS) $<

sorties correctement

g++ -c <my flags> -o <.o file> <.cpp file>

Pour résumer, je suis incapable de compiler normalement en transférant les fichiers source dans un sous-répertoire nouvellement créé et en créant les fichiers .o dans ce répertoire. TYIA.

+2

Affichez la ligne où '$ (FLAGS)' est défini. S'il s'agit d'une variable spécifique à une cible, cela peut entraîner le problème que vous décrivez. De même, si elle est définie en utilisant ': =' et qu'elle est _below_ la cible '$ (NOW)%. O', sa valeur ne sera pas prise en compte dans cette règle. Un makefile plus complet aiderait certainement à diagnostiquer le problème. – blackghost

Répondre

-1

Ad John souligne, il n'y a aucun moyen de diagnostiquer définitivement votre problème avec le petit fichier makefile que vous avez fourni, car l'erreur n'est pas dans le code que vous avez fourni, c'est dans une autre partie de votre makefile. Vous devez fournir un SSCCE idéalement, mais si ce n'est pas le cas, nous devons au moins voir comment la variable NOW est définie et la règle de l'éditeur de liens afin que nous sachions ce que make tente de construire.

Je devrais également souligner que, par convention, vous ne devez pas utiliser CC pour contenir le compilateur C++; la variable CC contient le compilateur C. Utilisez CXX pour le compilateur C++ et CXXFLAGS pour les indicateurs de compilateur C++.

Vous pouvez attribuer la variable NOW à l'aide d'une affectation récursive afin que l'horodatage soit recréé à chaque fois que la variable est évaluée. il se peut que l'horodatage change au cours de la vie du fichier makefile.

L'autre problème très courant est que vous avez créé la règle de motif, mais que make ne l'utilise pas parce que les cibles ne veulent pas que le motif corresponde au motif.

Ainsi, par exemple, si votre ligne de lien ressemble à ceci:

SRCS = foo.cpp 
OBJS = $(SRC:.cpp=.o) 

myprog: $(OBJS) 
     $(CXX) ... 

$(NOW)%.o : $(NOW)%.cpp 
     $(CXX) ... 

alors votre modèle ne sera pas adapté parce est d'essayer de construire le fichier foo.o et votre règle lui indique comment construire $(NOW)foo.o qui sont pas la même chose.