'make: ничего не нужно делать для p1 и' нет правила, чтобы сделать цель 'чистой' ' - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь создать make-файл с названием 'p1' для проекта.

Когда я пытаюсь выполнить команду make p1, она возвращается с make: nothing to be done for p1

Кроме того, когда я пытаюсь выполнить команду make p1 clean, она возвращает no rule to make p1 'clean.' Stop

Вот мой makefile:

a.out: main.o P1LinkedList.o const_iterator.o iterator.o Node.o
        g++ -std=c++11 main.o const_iterator.o iterator.o Node.o

main.o:
        g++ -std=c++11 -c main.cpp

P1LinkedList.o:
        g++ -std=c++11 -c P1LinkedList.cpp

iterator.o:
        g++ -std=c++11 -c iterator.cpp

const_iterator.o:
        g++ -std=c++11 -c const_iterator.cpp

Node.o:
        g++ -std=c++11 -c Node.cpp

depend:
        g++ -MM main.cpp > p1.dep

clean:
        rm -f a.out *.o

Что мне нужно исправить, чтобы компилировать файлы .o makefile из моих файлов. cpp и как мне решить проблему с командой clean?

Редактировать: Вот команды, которые я использовал для компиляции вручную:

Helens-Air:p1a helenade$ g++ -std=c++11 *.cpp
Helens-Air:p1a helenade$ ./a.out

^^, и это просто продолжает выполнение программы оттуда

1 Ответ

0 голосов
/ 23 января 2020

Возможно, нам придется принять это поэтапно.

Во-первых, вы, похоже, неправильно понимаете разницу между makefile name и target имя. Похоже, что это было недопонимание между вами и вашим учителем, но это легко устранить.

Предположим, у вас есть make-файл с именем "Makefile", содержащий следующее:

foo:
    @echo running the foo rule

bar:
    @echo running the bar rule

Если Вы make foo, вы получите:

running the foo rule

Аргумент (foo) указывает Make, какую цель пытаться построить. И как Make узнал, какой make-файл использовать? (В конце концов, вы можете иметь дюжину make-файлов в рабочем каталоге.) Вы можете указать, какой make-файл использовать, но если вы этого не сделаете, то по умолчанию Make будет искать make-файл с именем Makefile (или makefile или GNUmakefile, пока не беспокойтесь об этом). Чтобы указать make-файл с другим именем, например, «Buildfile», вы можете использовать флаг -f:

make -f Buildfile

Так что «p1» должно быть именем цели , не make-файл. В make-файле переименуйте правило a.out в p1. Затем переименуйте весь make-файл в Makefile. Тогда

make p1

должно сработать (или хотя бы запустить).

Редактировать:

Я go выйду на конечности. В правиле a.out (которое теперь должно называться правилом p1) я заметил, что вы оставили P1LinkedList.o в списке объектных файлов, которые нужно связать. Поэтому попробуйте изменить его:

p1: main.o P1LinkedList.o const_iterator.o iterator.o Node.o
    g++ -std=c++11 main.o P1LinkedList.o const_iterator.o iterator.o Node.o

Если это работает, вы можете упростить его с помощью automati c variable :

p1: main.o P1LinkedList.o const_iterator.o iterator.o Node.o
    g++ -std=c++11 $^

И будут другие небольшие улучшения, которые вы можете сделать.

Если это не не работает, попробуйте ls *.cpp и посмотрите, пропустили ли вы другой исходный файл.

...