2009-08-02 6 views
0

J'ai un makefile, et un extrait ressemble à ceci (les fichiers et les cibles rebaptisés pour plus de clarté):dépendances dans makefile

 
target1 : OtherLib.o MyProg.h MyProg.cpp 
    g++ -c ./MyProg.cpp -o $(BUILD_DIR)/MyProg.o 

Quand je lance « make TARGET1 », je veux faire de vérifier que MONPROG .h et MyProg.cpp sont à jour et lancent target1 sinon. Cependant, j'obtiens l'erreur

 
make: *** No rule to make target `MyProg.cpp', needed by `target1'. Stop. 

Mais 'MyProg.cpp' est ce que j'essaye de compiler! Donc, j'ai fait une cible vide pour cela, comme ceci:

 
MyProg.h : 
MyProg.cpp : 
target1 : OtherLib.o MyProg.h MyProg.cpp 
    g++ -c ./MyProg.cpp -o $(BUILD_DIR)/MyProg.o 

Cela fonctionne, mais cela semble bizarre. Je suis sous l'impression que si je fais simplement ceci:

 
target1 : OtherLib.o 
    g++ -c ./MyProg.cpp -o $(BUILD_DIR)/MyProg.o 

alors MONPROG seront compilés indépendamment du fait que oui ou non il est à jour, parce que MyProg.cpp ne figure pas comme une dépendance. Quelle est la bonne façon de faire cela pour que make ne compile MyProg.o que si MyProg.cpp et MyProg.h ne sont pas à jour?

Répondre

2

Cela ne semble pas devoir se produire. Peut-être devriez-vous vérifier soigneusement s'il y a une erreur d'orthographe. Si votre système d'exploitation vous cache des extensions de fichiers, je m'en méfierais particulièrement.

+4

Ma règle d'or pour la compilation heureux - jamais, jamais utiliser des noms de fichiers de casse mixte. –

+0

Ou des noms de fichiers ou des dossiers avec des espaces. Provoque tant de problèmes avec l'analyse de la ligne de commande. –

2

Je ne parviens pas à reproduire votre problème. Vous pouvez essayer de faire make avec l'option -d pour obtenir un historique très détaillé de ce que make essaie de faire. Ma meilleure supposition est que c'est regarder dans le mauvais répertoire pour une raison quelconque.

0

Je pense que si aucun exécutable appelé target1 n'est généré, votre cible target1 sera en fait une cible bidon et les commandes correspondantes seront toujours exécutées. Donc votre code sera compilé dans tous les cas.
Bien que je suis également incapable de reproduire votre problème: Aucune règle pour rendre la cible `MyProg.cpp '