2009-04-24 9 views
1

Je suis nouveau à makefiles et face à un problème avec lui. J'ai créé le makefile suivant. Cela fonctionne correctement. Mais quand je modifie le main.cpp et exécuter faire, il dit "tout est à jour". Je dois faire un faire propre et exécuter make again, tout va fonctionner.makefile ne construit pas la partie mise à jour du programme - C++

On dirait qu'il y a un problème avec ce fichier makefile et je n'arrive pas à comprendre où ça va mal. Quelqu'un peut-il m'aider à trouver où est l'erreur dans ce fichier makefile et pourquoi il ne construit pas les fichiers modifiés?

#Main makefile which does the build 

CFLAGS = 
CC = g++ 
PROG = fooexe 

#each module will append the source files to here 
SRC := 

#including the description 
include foo/module.mk 

OBJ := $(patsubst %.cpp, %.o, $(filter %.cpp,$(SRC))) main.o 

#linking the program 
fooexe: $(OBJ) 
    $(CC) -o $(PROG) $(OBJ) 

%.o: 
    $(CC) -c $(SRC) -o $(patsubst %.cpp, %.o, $(filter %.cpp,$(SRC))) 

main.o: 
    $(CC) -c main.cpp 

depend: 
    makedepend -- $(CFLAGS) -- $(SRC) 

.PHONY:clean 
clean: 
    find . -name "*.o" | xargs rm -vf 
    rm -vf fooexe 

Répondre

5

Normalement le fichier .o doit avoir une dépendance sur le fichier .cpp correspondant. Je pense que c'est la syntaxe, mais pas à 100% sûr:

%.o : %.cpp 
    $(CC) ... 

main.o : main.cpp 
    $(CC) ... 
+0

Vous êtes l'homme. Ça a marché. J'ai oublié de donner ça. –

+0

Remplir la commande correcte à la place du "..." est également important, si vous voulez faire uniquement reconstruire les fichiers qui ont changé. – bk1e

+0

Le bit principal est redondant, si ... représente le même texte dans les deux cas. –

0

Exécutez votre make avec le débogage activé et voyez ce que vous obtenez.

Make est un code tellement ancien qu'il est quasiment certain qu'il fait ce qu'il pense que vous voulez.

Le fait que vous utilisiez find pour trouver vos fichiers .o me fait penser que vous avez des sous-répertoires dans la réalité; Si c'est le cas, vous devez vous assurer que Make peut les voir.

+0

Je suis sûr que je peux les voir. Parce que cela fonctionne bien après un nettoyage. Le problème est après la première construction. –

1

Votre règle à l'aide main.cpp - main.o - ne précise rien pour main.o dépendre. Vous avez besoin que cette ligne soit "main.o: main.cpp" à tout le moins, et aussi tout autre fichier source dont main.o dépend. Je vois que vous avez une règle dépendante en utilisant makedepend; l'utilisez-vous correctement? Je ne l'ai pas utilisé moi-même, mais je finis toujours mes makefiles avec quelque chose comme ce qui suit:

depend: 
    mv Makefile Makefile.bak 
    sed '/^#DO NOT DELETE THIS LINE$$/,$$d' Makefile.bak > Makefile 
    echo '#DO NOT DELETE THIS LINE' >> Makefile 
    echo '#' >> Makefile 
    $(CC) -MM *.c >> Makefile 

# 
#DO NOT DELETE THIS LINE 
#

Puis, quand je lance « make dépends » Je reçois des lignes comme les suivantes:

main.o: main.c main.h otherstuff.h 
otherstuff.o: otherstuff.c otherstuff.h
5
%.o: 
    $(CC) -c $(SRC) -o $(patsubst %.cpp, %.o, $(filter %.cpp,$(SRC))) 

Il s'agit d'une règle de modèle qui indique make, "chaque fois qu'un fichier .o est requis et n'existe pas, exécutez $(CC) sur tous les fichiers .cpp dans $(SRC)." Il ne recompile pas les fichiers .cpp lorsqu'ils sont modifiés car il ne répertorie aucune condition préalable. Si les fichiers .o requis existent déjà, il n'y a aucune raison d'exécuter la commande $(CC).

Si vous changez la première ligne à %.o: %.cpp comme Andy White a suggéré, la règle mise à jour indique maintenant faire, « chaque fois qu'un fichier .o est nécessaire et n'existe pas ou est plus ancien que le fichier .cpp correspondant, exécutez $(CC) sur tous les des fichiers .cpp dans $(SRC). "

C'est mieux, mais il y a toujours un problème: la règle mise à jour compile toujours tous vos fichiers .cpp, même ceux qui sont à jour. Pour résoudre ce problème, la partie commande de la règle doit recompiler le fichier .cpp correct dans le fichier .o correct.Vous pouvez le faire en utilisant des variables automatiques telles que $< (1er préalable) et [email protected] (cible):

%.o: %.cpp 
    $(CC) -c $< -o [email protected] 

Le GNU Make Manual a plus d'explications et de détails.

+0

C'est génial. Merci pour l'info. Je vais vérifier le manuel de fabrication. –

+0

Encore pire si vous changez n fichiers, il compilera n fois tous les fichiers. Mais oui cette réponse est correcte. +1 –