make: Rien à faire pour “tous”

Je passe par exemple dans un pgm pour créer un fichier make.

http://mrbook.org/tutorials/make/

Mon dossier eg_make_creation contient les fichiers suivants,

desktop:~/eg_make_creation$ ls factorial.c functions.h hello hello.c main.c Makefile 

Makefile

 # I am a comment, and I want to say that the variable CC will be # the comstackr to use. CC=gcc # Hwy!, I am comment no.2. I want to say that CFLAGS will be the #options I'll pass to the comstackr CFLAGS=-c -Wall all:hello hello:main.o factorial.o hello.o $(CC) main.o factorial.o hello.o -o hello main.o:main.c $(CC) $(CFLAGS) main.c factorial.o:factorial.c $(CC) $(CFLAGS) factorial.c hello.o:hello.c $(CC) $(CFLAGS) hello.c clean: rm -rf *o hello 

Erreur:

 desktop:~/eg_make_creation$ make all make: Nothing to be done for `all'. 

S’il vous plaît aidez-moi à comprendre pour comstackr ce programme.

Parfois, l’erreur “Rien à faire pour tous” peut être causée par des espaces avant la commande dans la règle makefile au lieu de l’onglet. Assurez-vous d’utiliser des tabulations plutôt que des espaces à l’intérieur de vos règles.

 all: < \t>$(CC) $(CFLAGS) ... 

au lieu de

 all: $(CC) $(CFLAGS) ... 

Supprimez le fichier hello de votre dossier et réessayez.

La cible all dépend de la cible hello . La cible hello essaie d’abord de trouver le fichier correspondant dans le système de fichiers. S’il le trouve et qu’il est à jour avec les fichiers dépendants, il n’y a rien à faire.

Lorsque vous donnez simplement make, il crée la première règle dans votre fichier makefile, c’est-à-dire “all”. Vous avez spécifié que “all” dépend de “hello”, qui dépend de main.o, factorial.o et hello.o. Donc, «make» essaie de voir si ces fichiers sont présents.

S’ils sont présents, ‘make’ voit si leurs dépendances, par exemple main.o a une dépendance main.c, ont changé. S’ils ont changé, make les reconstruit, sinon la règle est ignorée. De la même façon, il continue de construire récursivement les fichiers qui ont changé et exécute finalement la commande la plus haute, “all” dans votre cas, pour vous donner un exécutable, “hello” dans votre cas.

S’ils ne sont pas présents, faites aveuglément tout en vertu de la règle.

En ce qui concerne votre problème, ce n’est pas une erreur, mais «make» dit que chaque dépendance de votre fichier Make est à jour et qu’il n’est pas nécessaire de créer quoi que ce soit!

Make se comporte correctement. hello existe déjà et n’est pas plus ancien que les fichiers .c , par conséquent il n’y a plus de travail à faire. Il y a quatre scénarios dans lesquels make devra (re) construire:

  • Si vous modifiez l’un de vos fichiers .c , il sera plus récent que hello et devra être reconstruit à l’exécution de make.
  • Si vous supprimez hello , alors il faudra évidemment le reconstruire
  • Vous pouvez forcer make à tout reconstruire avec l’option -B . make -B all
  • make clean all effacera hello et nécessitera une reconstruction. (Je vous suggère de regarder le commentaire de rm -f *.o hello sur rm -f *.o hello

Ce n’est pas une erreur que la commande make de unix fonctionne en fonction des horodatages, c’est-à-dire si vous avez apporté certaines modifications à factorial.cpp et comstackz en utilisant make .. La commande cpp ** est exécutée. La prochaine fois, si vous exécutez la même commande, c.-à-d. sans modifier aucun fichier avec l’extension .cpp, le compilateur dit que le fichier de sortie est à jour … certaines modifications apscopes à un fichier.cpp. L’avantage du fichier make est qu’il réduit le temps de recompilation en compilant les seuls fichiers modifiés et en utilisant directement les fichiers object (.o) des fichiers non modifiés ……

Je pense que vous avez manqué un onglet en 9ème ligne. La ligne suivante : bonjour doit être un onglet vide. Assurez-vous d’avoir un onglet vide en 9ème ligne. Cela fera comprendre à l’interprète que vous voulez utiliser la recette par défaut pour le makefile.