117 votes

faire : Rien à faire pour `all'.

Je suis en train de parcourir une eg 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 compiler 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 compiler
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'.

Veuillez m'aider à comprendre comment compiler ce programme.

19 votes

Essayez de faire un "make clean" suivi d'un "make all".

13 votes

Ce n'est pas une erreur, ça veut juste dire que hello est à jour. Modifier clean a rm -f *.o hello avant qu'il ne fasse quelque chose d'inattendu, puis lancez make clean all et voir si cela fonctionne.

1 votes

Vous devez également ajouter .phony: all clean puisque all y clean ne sont pas des noms de fichiers.

146voto

VirtualVDX Points 78

Parfois, l'erreur "Rien à faire pour tous" peut être causée par des espaces avant la commande dans la règle du makefile au lieu de tabulations. Veuillez vous assurer que vous utilisez des tabulations au lieu d'espaces dans vos règles.

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

au lieu de

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

Veuillez consulter le manuel GNU make pour la description de la syntaxe des règles : https://www.gnu.org/software/make/manual/make.html#Rule-Syntax

0 votes

Obj-m += hello.o tout : </t>make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean : make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

0 votes

Le fichier ci-dessus est un fichier valide ??

0 votes

Dans le contexte des Makefiles parents-enfants, l'erreur "Rien à faire pour tous" peut parfois être causée par des cibles enfants incorrectement marquées déclarées .PHONY dans le Makefile parent.

35voto

weekens Points 2685

Retirer le hello de votre dossier et réessayez.

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

0 votes

Obj-m += hello.o tout : </t>make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean : make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

0 votes

Est-ce que le fichier ci-dessus est un fichier make valide ?

21voto

Quand vous donnez simplement make, il fait la première règle de votre 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' regarde si leurs dépendances, par exemple main.o a une dépendance main.c, ont changé. S'ils ont changé, make les reconstruit, sinon il ignore la règle. De la même manière, il continue à construire récursivement les fichiers qui ont changé et finalement exécute la commande la plus élevée, "all" dans votre cas, pour vous donner un exécutable, "hello" dans votre cas.

S'ils ne sont pas présents, il faut construire aveuglément tout ce qui relève de la règle.

Pour en venir à votre problème, ce n'est pas une erreur mais 'make' dit que toutes les dépendances de votre makefile sont à jour et qu'il n'a pas besoin de faire quoi que ce soit !

17voto

Aaron McDaid Points 7761

Make se comporte correctement. hello existe déjà et n'est pas plus ancienne que la .c et il n'y a donc plus de travail à faire. Il y a quatre scénarios dans lesquels make devra (re)construire :

  • Si vous modifiez l'un de vos .c alors il sera plus récent que hello et ensuite il devra être reconstruit quand vous lancerez make.
  • Si vous supprimez hello alors il faudra évidemment le reconstruire.
  • Vous pouvez forcer make à tout reconstruire avec la commande -B option. make -B all
  • make clean all supprimera hello et nécessitent une reconstruction. (Je vous suggère de regarder le commentaire de @Mat sur rm -f *.o hello

5voto

muneshwar Points 21

Ce n'est pas une erreur ; la commande make dans unix fonctionne sur la base des horodatages. Par exemple, disons que si vous avez fait certains changements à factorial.cpp et compiler en utilisant make puis faire montre l'information que seul le cc -o factorial.cpp est exécutée. La prochaine fois, si vous exécutez la même commande, c'est-à-dire make sans apporter de modifications à un fichier avec .cpp extension, le compilateur indique que le fichier de sortie est à jour. Le compilateur donne cette information jusqu'à ce que nous fassions certaines modifications à l'un des éléments suivants file.cpp .

L'avantage de la makefile est qu'il réduit le temps de recompilation en compilant les seuls fichiers qui sont modifiés et en utilisant l'objet ( .o ) des fichiers non modifiés directement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X