#include void print_hello(void); int factorial(int n);
#include #include int main() { print_hello(); printf("\nThe factorial is: %d \n",factorial(5)); return 0; }
#include #include void print_hello() { printf("\nHello World!\n"); }
#include #include int factorial(int n) { if(n!=1) { return(n*factorial(n-1)); } else return 1; }
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.