Je suis en train de passer par un pgm par exemple 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.
hello
est à jour. Passezclean
àrm -f *.o hello
avant qu'il ne fasse quelque chose d'inattendu, puis exécutezmake clean all
et voyez si cela fonctionne..phony: all clean
, puisqueall
etclean
ne sont pas des noms de fichiers.Réponses:
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 tab. Veuillez vous assurer que vous utilisez des tabulations au lieu d'espaces à l'intérieur de vos règles.
au lieu de
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
la source
all : src/server/mod_wsgi.la
, ce que j'ai changéall : </t> src/server/mod_wsgi.la
. J'obtiens maintenant l'erreur:make: execvp: src/server/mod_wsgi.la: Permission denied Makefile:29: recipe for target 'all' failed make: *** [all] Error 127
aprèssudo make
. De l'aide?Supprimez le
hello
fichier de votre dossier et réessayez.La
all
cible dépend de lahello
cible. Lahello
cible 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.la source
Quand vous donnez juste make, cela crée la première règle de votre makefile, c'est-à-dire "all". Vous avez spécifié que "tout" 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é, faites-les reconstruire, sinon ignore la règle. De même, il continue récursivement à construire les fichiers qui ont changé et exécute finalement la commande la plus élevée, "all" dans votre cas pour vous donner un exécutable, "bonjour" dans votre cas.
S'ils ne sont pas présents, faites tout construire à l'aveugle selon la règle.
Pour en venir à votre problème, ce n'est pas une erreur, mais «make» signifie que chaque dépendance de votre makefile est à jour et qu'il n'a pas besoin de faire quoi que ce soit!
la source
Make se comporte correctement.
hello
existe déjà et n'est pas plus ancien que les.c
fichiers, il n'y a donc plus de travail à faire. Il existe quatre scénarios dans lesquels make devra (re) construire:.c
fichiers, il sera plus récent quehello
, puis il devra se reconstruire lorsque vous exécuterez make.hello
, alors il devra évidemment le reconstruire-B
option.make -B all
make clean all
supprimerahello
et nécessitera une reconstruction. (Je vous suggère de regarder le commentaire de @ Mat surrm -f *.o hello
la source
Je pense que vous avez manqué un onglet en 9e ligne. La ligne qui suit tout: bonjour doit être un onglet vide. Assurez-vous que vous avez un onglet vide sur la 9ème ligne. Cela fera comprendre à l'interpréteur que vous voulez utiliser la recette par défaut pour makefile.
la source
Ce n'est pas une erreur; la commande make dans unix fonctionne en fonction des horodatages. Par exemple, si vous avez apporté certaines modifications
factorial.cpp
et compilez en utilisant,make
alors make affiche les informations indiquant que seule lacc -o factorial.cpp
commande est exécutée. La prochaine fois, si vous exécutez la même commande, c'est-make
à- dire sans apporter de modifications à aucun fichier avec une.cpp
extension, le compilateur dit que le fichier de sortie est à jour. Le compilateur donne ces informations jusqu'à ce que nous apportions certaines modifications à toutfile.cpp
.L'avantage de l '
makefile
est qu'il réduit le temps de recompilation en compilant les seuls fichiers modifiés et en utilisant.o
directement les fichiers object ( ) des fichiers non modifiés.la source
Je suis arrivé à cette erreur particulière et difficile à déboguer par une voie différente. Mon problème a fini par être que j'utilisais une règle de modèle dans une étape de construction lorsque la cible et la dépendance se trouvaient dans des répertoires distincts. Quelque chose comme ça:
J'avais plusieurs dépendances configurées de cette façon et j'essayais d'utiliser une recette de modèle pour toutes. Clairement, une seule substitution pour «%» ne fonctionnera pas ici. J'ai fait des règles explicites pour chaque dépendance, et je me suis retrouvé parmi les chiots et les licornes!
J'espère que cela aide quelqu'un!
la source