2010-10-06 12 views
1
CC = g++ 
CFLAGS = -Wall 

RM = /bin/rm -rf 
BIN_DIR = 

ifeq "$(DEBUG)" "1" 
BIN_DIR = Debug 
else 
BIN_DIR = Release 
endif 

OBJS = \ 
$(BIN_DIR)/Unit.o 

$(BIN_DIR)/%.o: src/%.c 
    @echo Building "[email protected]" 
    @g++ -c "$<" -o"[email protected]" 

all: $(OBJS) 
clean: 
    $(RM) $(BIN_DIR) 

.PHONY: all clean 

Cependant, lorsque je tente de construire mon projet ce, il me donne l'erreur:Aide Makefile: Aucune règle pour faire la cible

make: *** No rule to make target 'Release/Unit.o', needed by 'all'. Stop.

Je suis nouveau à l'écriture makefiles à partir de zéro et donc cela pourrait être une question stupide, mais toute aide est appréciée!

+2

Avez-vous 'src/Unit.c' d'où vous lancez' make'? – adamk

+0

Oui. Le dossier 'src' est au même niveau que le Makefile, et le fichier Unit.c est là. – Sagar

+0

Désolé, c'était juste une faute de frappe. Ce n'est pas le problème cependant. C'était juste mon erreur en tapant dans la question – Sagar

Répondre

1

Le problème est ici:

$(BIN_DIR)/%.o: src/%.c 
    @echo Building "[email protected]" 
    @g++ -c "@<" -o"[email protected]" 

Je pense que ce plus comme ceci:

$(BIN_DIR)%.o: %.c 
    $(CC) -o [email protected] -c $< $(CFLAGS) 
+0

Merci, cela a semblé fonctionner. Le @<était seulement une faute de frappe dans ma question, j'avais réellement "$ <" dans mon Makefile. Quoi d'autre a changé? – Sagar

+0

Mais comment 'make' et' cc' savent-ils que le code source est dans * src * plutôt que dans * Release * ou * Debug *? –

+0

J'ai copié sur le code qu'il a ici, et ajouté le src/et cela a fonctionné. C'est pourquoi je n'arrive pas à comprendre ce qui a changé. Mais ça a marché. Pour l'instant, la satisfaction. – Sagar

1

Comme Sean Brillant déjà fait remarquer, en changeant

@g++ -c "@<" -o"[email protected]" 

à

@g++ -c "$<" -o"[email protected]" 

fait également le travail Makefile pour moi (ming32-make: GNU Make 3,81)

Puisque vous aviez le Makefile sur le même niveau que le fichier source (dans le répertoire src), votre règle échouaient.