Проблема с моим коротким Unix Makefile - PullRequest
0 голосов
/ 19 сентября 2011

Что я могу сделать, чтобы решить эту проблему? Я новичок в emacs, Unix и makefiles. Пожалуйста, объясните, что я делаю неправильно и как я могу это исправить. Я уверен, что это простая проблема

progA: yesno.h yesno.cpp
       g++ -DDEBUG -c yesno.cpp yesno.h
progB: guess.cpp
       g++ -DDEBUG -c guess.cpp
progC: yesno.o guess.o
       g++ -DDEBUG -o guess guess.o yesno.o

Моя ошибка:

Your makefile does too much work when only guess.cpp has been changed:
g++ -c yesno.cpp yesno.h
g++ -c guess.cpp
g++ -o guess guess.o yesno.o

1 Ответ

2 голосов
/ 19 сентября 2011

Ваш make-файл будет перекомпилировать все каждый раз.

Вам не нужны первые четыре строки;make знает, как создавать объектные файлы из исходного кода.Или, в качестве альтернативы, вам нужно изменить эти 4 строки на 2, поставить их в конце и изменить имена целей:

guess: yesno.o guess.o
        g++ -o guess yesno.o guess.o
guess.o: yesno.h
yesno.o: yesno.h

Первая цель - это та, которая построена по умолчанию, так чтогарантирует, что guess (программа) собрана.В командной строке пропускается -DDEBUG, так как это влияет только на компиляцию исходного кода, и в этой строке нет источника (хотя, если использовать макросы, как в расширенном makefile, я подойдет с такими параметрами, как-DDEBUG появляется в строке ссылки).

Третья строка говорит, что guess.o зависит от yesno.h;это предположение (с моей стороны).Программа make уже знает, как конвертировать guess.cpp в guess.o;ему просто нужна дополнительная информация, что он также использует заголовок yesno.h.(Если нет, как он узнает о функциях, определенных в yesno.cpp?)

В последней строке указано, что yesno.o зависит от yesno.h;опять же, make знает, как скомпилировать yesno.cpp в yesno.o, но нуждается в дополнительной информации о заголовке.

Это должно перекомпилировать guess.o, только когда guess.cpp изменяется;он должен перекомпилировать yesno.o только при изменении yesno.cpp;он должен перекомпилировать оба объектных файла при изменении yesno.h.Если какой-либо из исходных файлов изменится, программа будет перекомпонована;если исходные файлы не изменяются, то команда make не должна ничего делать (или просто сообщать, что делать нечего).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...