make: *** Pas de règle pour rendre la cible `main.c ‘nécessaire par` main.o’. Arrêtez

fonctions.h

#include void print_hello(void); int factorial(int n); 

principal c

 #include #include int main() { print_hello(); printf("\nThe factorial is: %d \n",factorial(5)); return 0; } 

Bonjour c

 #include #include void print_hello() { printf("\nHello World!\n"); } 

factorial.c

 #include #include int factorial(int n) { if(n!=1) { return(n*factorial(n-1)); } else return 1; } 

makefile

 exec : \ comstack echo "Executing the object file" ./comstack comstack : main.o hello.o factorial.o echo "Compiling" gcc -o comstack $^ main.o : main.c functions.h gcc -c main.c -I./INCLUDE -I./SRC hello.o : hello.c functions.h gcc -c hello.c -I./INCLUDE -I./SRC factorial.o : factorial.c functions.h gcc -c factorial.c -I./INCLUDE -I./SRC 

Dossier: make_example \ INCLUDE \ functions.h Dossier: make_example \ SRC \ main.c Dossier: make_example \ SRC \ hello.c Dossier: make_example \ SRC \ factorial.c Dossier: make_example \ makefile

Je reçois une erreur lors de la compilation du fichier make en tant que “bureau: ~ / make_example $ make

make: * Aucune règle pour rendre la cible main.c', needed by main.o’. Arrêtez.”

S’il vous plaît aidez-moi à comprendre pourquoi cette erreur

Lorsque vous lancez, il essaye de créer la première cible dans le fichier ( exec ), qui dépend de la comstack , qui dépend de main.o , qui dépend de main.c Il n’y a pas de fichier main.c , seulement SRC/main.c Il n’y a pas de règle pour créer un fichier appelé main.c , et il n’y a pas de fichier main.c préexistant, donc make a une erreur et quitte.

Vous pouvez résoudre ce problème avec VPATH ou vpath :

 VPATH = SRC INCLUDE 

Votre main.c est dans le sous-répertoire src, et make ne sait pas y chercher. Il existe de nombreuses options, dont la plus simple consiste à écrire “src / main.c” au lieu de “main.c” dans le fichier Make. Vous pouvez également déplacer main.c sur un niveau, ou déplacer le fichier make vers src / et le construire, ou placer un fichier makefile dans le toplevel qui cd dans src et appeler (make est récursif, que beaucoup considèrent comme “nuisible”, mais cela convient parfaitement dans la plupart des cas. Vous pouvez également utiliser une directive VPATH, mais si vous choisissez de le faire, sachez que cela ne fonctionnera pas avec toutes les versions de make.