2016-06-17 2 views
0

Я пытаюсь сделать Makefile, даже жестко Я могу сделать простой Makefile, я не могу заставить его работать, когда мне нужно сортировать файлы в разных папках, что я нужна папка/translator с: Makefile, папкой src со всеми файлами .c и .h, папкой с файлами для перевода и папкой bin для всех файлов .o и исполняемого файла.Makefile in C - no rule to make target

Это Makefile я сделал:

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 

Но как только я печатаю make клеммные шоу:

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

Я ранее сделал Makefile для Java этот путь, и она работала , и в файле src есть, конечно, файл word.h и word.c, так почему же он не находит его?

+0

Я сделал это в Java, теперь я прочитал, что правильный способ сделать && так, что вы знаете, что команда компакт-диск был успешным –

+0

Даже после удаления компакт-диск ./src, он все еще не находит файлы-мишени для создания word.o, я полагаю, что я standi ng в неправильной папке, но как это должно быть? –

ответ

3

Вы сказали, что сделать translate (в текущем каталоге) зависит от word.o и т.д. (в текущем каталоге), который зависит от word.c и word.h (в текущем каталоге).

есть, конечно, файл word.h и word.c внутри папки src, так почему же он не находит его?

Потому что вы не сказали ему посмотреть в src.

Вы могли бы сделать что-то вроде:

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

Проблема заключается в том, что ваши действия не соответствуют вашим зависимости - у вас есть правило, которое говорит, что это (Смотрите также https://www.gnu.org/software/make/manual/html_node/File-Name-Functions.html и https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html.) строит word.o от word.c, но тогда команда с ним фактически производит src/word.o от src/word.c. Смотря на другие правила, вы даже не хотите src/word.o, вы хотите bin/word.o.

Таким образом, вы должны исправить все свои правила, чтобы иметь правильные имена и пути к файлам, которые вы на самом деле хотите использовать:

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] 

После того, как вы сделаете это, вы увидите, что большинство действий являются то же самое, так что вы можете использовать шаблонное правило и зависимостей:

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 
Смежные вопросы