2017-09-22 4 views
1

J'écris un Makefile dans ce répertoire:Erreur Makefile: Aucune règle pour rendre la cible, nécessaire pour 'tous'. Arrêtez

. 
├── bin 
│   └── obj 
├── include 
│   ├── globals.h 
│   ├── ma.h 
│   ├── mb.h 
│   ├── mc.h 
│   └── md.h 
├── Makefile 
├── Makefile.save 
├── src 
│   ├── ma.c 
│   ├── main.c 
│   ├── mb.c 
│   ├── mc.c 
│   └── md.c 
└── test 
    ├── main.c 
    └── main.o 

Mon Makefile est la suivante:

CFLAGS := -Wall -g -pedantic --std=c99 

objs := bin/obj/ma.o bin/obj/mb.o bin/obj/mc.o bin/obj/md.o bin/obj/main.o 

all: $(objs) 

%.o: %.c 
    gcc -c $< -o [email protected] $(CFLAGS) 

Mais je ne peux pas exécuter avec make ordre; le programme me donne cette erreur:

make: *** No rule to make target 'bin/obj/ma.o', needed by 'all'. Stop. 

Quelqu'un a une idée?

+0

vos fichiers c sont dans le dossier ** src ** et pourquoi ** bin **? vous pouvez juste utiliser obj/* –

Répondre

2

Vous devez dire faire pour mapper les noms de fichier source pour les fichiers objets d'une certaine façon. Cela pourrait fonctionner:

bin/obj/%.o: src/%.c 
    gcc -c $< -o [email protected] $(CFLAGS) 

Vous devrez faire la même chose séparément pour le sous-répertoire test.

Pour l'en-tête du fichier d'en-tête manquant, vous devez ajouter -Iinclude à la ligne de commande (de préférence dans une autre variable et non dans CFLAGS, de sorte qu'il est toujours possible de passer outre CFLAGS de la ligne de commande).

+0

je votre code, mais le programme me donne ce message d'erreur: mA.h: Aucun fichier ou répertoire existe #include ^ compilation terminé. Makefile: 11: la recette de la cible 'bin/obj/ma.o' a échoué make: *** [bin/obj/ma.o] Erreur 1 – faltumd96

+0

@ faltumd96 Pourquoi avez-vous '#include ' dans votre code ? – melpomene

+0

J'ai ajouté un commentaire sur les fichiers include. –

-1

Vous n'avez pas un dossier bin ni bin/obj ...

+0

J'ai édité la question. Ça ne fait aucune différence, alors que le dossier existe ou quand je créer avec faire – faltumd96