2016-06-17 11 views
0

Ich versuche ein Makefile zu machen, sogar hart kann ich ein einfaches Makefile machen, ich kann es nicht funktionieren, wenn ich die Dateien in verschiedenen Ordnern sortieren muss, was ich needs is/translator Ordner mit: Makefile, src Ordner mit allen .c und .h Dateien, Dateien Ordner mit den zu übersetzenden Dateien und bin Ordner für alle .o Dateien und die ausführbare Datei.Makefile in C - keine Regel um Ziel zu machen

Dies ist die Make-Datei ich gemacht:

CC = gcc 
CFLAGS = -Wall -Werror -Wextra -pedantic -std=c99 -g 
OBJECTS = word.o pair.o list.o dict.o set.o 

translate : $(OBJECTS) 
    mkdir ./files 
    mkdir ./bin 
    cd ./src; $(CC) $(CFLAGS) -o translate $(OBJECTS) main.c; mv *.o ../bin; mv translate ../bin 

word.o: word.c word.h 
    cd ./src; $(CC) $(CFLAGS) -c word.c -o word.o 

pair.o: pair.c pair.h word.h 
    cd ./src; $(CC) $(CFLAGS) -c pair.c -o pair.o 

list.o: list.c list.h word.h pair.h 
    cd ./src; $(CC) $(CFLAGS) -c list.c -o list.o 

dict.o: dict.c dict.h word.h list.h 
    cd ./src; $(CC) $(CFLAGS) -c dict.c -o dict.o 

set.o: set.c set.h word.h list.h 
    cd ./src; $(CC) $(CFLAGS) -c set.c -o set.o 

.PHONY : clean 

clean : 
    $(RM) ./bin/*.* 
    rmdir ./bin 

Aber sobald ich make die Terminal zeigt ein:

make: *** No rule to make target `word.c', needed by `word.o'. Stop. 

Ich habe vorher ein Makefile für Java auf diese Weise, und es funktionierte und es gibt sicher eine Datei word.h und word.c innerhalb des src-Ordners, also warum findet sie es nicht?

+0

ich habe das in Java, jetzt lese ich, dass der richtige Weg, &&, dies zu tun, ist, dass Sie den Befehl cd wissen war succesfull –

+0

Auch nach cd Entfernen ./src findet es immer noch nicht die Zieldateien, um word.o zu machen, ich nehme an, ich bin standi ng in den falschen Ordner, aber wie sollte es sein? –

Antwort

3

Sie gesagt, dass translate machen (im aktuellen Verzeichnis) ist abhängig von word.o usw. (im aktuellen Verzeichnis), die auf word.c und word.h (im aktuellen Verzeichnis) abhängt.

es gibt sicher eine Datei word.h und word.c innerhalb des src-Ordners, also warum findet sie es nicht?

Weil Sie es nicht gesagt haben, in src zu schauen.

Man könnte so etwas wie tun:

OBJECTS = word.o pair.o list.o dict.o set.o main.o 
# main.o is also an object file 

bin/translate: $(addprefix bin/,$(OBJECTS)) 
     $(CC) $(CFLAGS) $+ -o [email protected] 

bin/word.o: src/word.c src/word.h 
     $(CC) $(CFLAGS) -c $< -o [email protected] 

# ... repeat for all source files 

1

Das Problem ist, dass Ihre Handlungen Ihre Abhängigkeiten nicht übereinstimmen - Sie eine Regel, die es sagt (siehe auch https://www.gnu.org/software/make/manual/html_node/File-Name-Functions.html und https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html.) baut word.o von word.c, aber dann erzeugt der Befehl mit ihm tatsächlich src/word.o von src/word.c. Sehen Sie sich andere Regeln an, Sie wollen nicht einmal wirklich src/word.o, Sie wollen bin/word.o.

So müssen Sie alle Ihre Regeln zu beheben, die richtigen Namen und Pfade für die Dateien, die Sie tatsächlich verwenden möchten:

OBJECTS = bin/word.o bin/pair.o bin/list.o bin/dict.o bin/set.o 

bin/translate : $(OBJECTS) 
     $(CC) $(CFLAGS) -o [email protected] $(OBJECTS) src/main.c 
bin/word.o: src/word.c src/word.h 
     $(CC) $(CFLAGS) -c $< -o [email protected] 
bin/pair.o: src/pair.c src/pair.h src/word.h 
     $(CC) $(CFLAGS) -c $< -o [email protected] 
bin/list.o: src/list.c src/list.h src/word.h src/pair.h 
     $(CC) $(CFLAGS) -c $< -o [email protected] 
bin/dict.o: src/dict.c src/dict.h src/word.h src/list.h 
     $(CC) $(CFLAGS) -c $< -o [email protected] 
bin/set.o: src/set.c src/set.h src/word.h src/list.h 
     $(CC) $(CFLAGS) -c $< -o [email protected] 

Sobald Sie das tun, sehen Sie, dass die meisten Aktionen sind die gleichen, so können Sie eine Musterregel und Abhängigkeiten verwenden:

OBJECTS = bin/word.o bin/pair.o bin/list.o bin/dict.o bin/set.o 

bin/translate : $(OBJECTS) src/main.c 
     $(CC) $(CFLAGS) -o [email protected] $(OBJECTS) src/main.c 
bin/%.o: src/%.c 
     $(CC) $(CFLAGS) -c $< -o [email protected] 
bin/word.o: src/word.h 
bin/pair.o: src/pair.h src/word.h 
bin/list.o: src/list.h src/word.h src/pair.h 
bin/dict.o: src/dict.h src/word.h src/list.h 
bin/set.o: src/set.h src/word.h src/list.h 
Verwandte Themen