2017-04-25 4 views
1

est ici une version simplifiée de mon Makefile:Makefile: Une dépendance sans règle ne remet pas en cause parent

all: myprogram 

myprogram: main.o 
    c++ main.o -o myprogram 

main.o: main.cpp mylib.hpp 
    c++ -c main.cpp 

mylib.hpp: mylib.inl 

Tous ces fichiers mentionnés ci-dessus sont des fichiers réels. Lorsque je change mylib.hpp, main.cpp recompile. Cependant, mon problème est que lorsque je change mylib.inl, main.cpp fait pas recompiler. Comment puis-je invalider la cible main.o et par conséquent la cible myprogram lorsque j'édite mylib.inl? Je préférerais pas pour utiliser une cible .PHONY, parce que je ne veux pas tout recompiler à chaque fois, juste seulement quand je modifie mylib.inl.

+0

Hmm Peut-être toucher mylib.hpp ou mettre 'mylib.hpp' sur' main.o: main.cpp mylib.hpp mylib.inl' – chux

Répondre

4

Votre problème est que la dépendance décrite dans votre makefile:

mylib.hpp: mylib.inl 

ne décrit pas une réelle dépendance. Changement mylib.inl ne change pas mylib.hpp (il n'y a pas de règle pour déclencher un tel changement).

Si mylib.inl est inclus à partir mylib.hpp alors il devrait en fait être une dépendance sur main.o plutôt que mylib.hpp, conduisant à une dépendance comme ceci:

main.o: main.cpp mylib.hpp mylib.inl 

Le maintien des dépendances individuelles manuellement est susceptible d'être sujette aux erreurs, ce qui est pourquoi la plupart des compilateurs fournissent des fonctions qui peuvent créer automatiquement des fichiers de dépendance que vous pouvez inclure dans votre fichier make. Vous pouvez ensuite fournir des règles plus génériques pour la compilation. Pour plus de détails sur comment l'utiliser, consultez this article.

+0

Dang, j'avais peur de ça. Mais merci pour la réponse! – Jerfov2