2010-09-29 2 views
0

давайте предположим, что у меня есть некоторые Makefile для Unixправила Makefile

prog:a.o b.o c.o 
    gcc a.o b.o c.o -o prog 
a.o:a.c a.h b.h 
    gcc -c a.c 
b.o:b.c b.h 
    gcc -c b.c 
c.o:c.c c.h b.h 
    gcc -c c.c 

Я прочитал, что если я изменю * .c файл я должен перекомпилировать только этот файл, но если я поменяю * .h файл я должен перекомпилировать все файлы, которые зависят от моего файла * .h, после обоих случаев в любом случае I must link все файлы с начала

1) Предположим, что я меняю только bh, так что мне нужно делать? мой вариант make a.o b.o c.o Я прав?

2) Предположим, что я меняю только c.c, так что мне нужно делать? мой вариант make c.o Я прав?

и, наконец, если я напишу make c.o, например, мой makefile ONLY recompile c.o, но what about linker? У меня есть только gcc -c c.c и не -o

заранее спасибо за любую помощь

ответ

2

Что именно вы имеете в виду «что мне нужно делать?». В каждом случае просто запустите make prog и дайте понять, что это такое.

EDIT: Если вам интересно, что делают будет делать в каждом конкретном случае, если вы бежите make prog каждый раз, читайте дальше:

В случае 1) ЬН изменилось, так что все зависит от него (ао , bo и co) будут перестроены, и прог будет повторно включен.

В случае 2) c.o - это только прямая зависимость от c.c, поэтому построена только c.o и прог повторно.

BTW, gcc может дать вам возможность использовать ваши зависимости, просто запустив gcc -MM *.c в вашем каталоге проектов.

+0

На стороне примечания, если вы используете gnu make, вы можете удалить каждую строку в своем make-файле, начиная с 'gcc'. Стандартные правила (http://www.gnu.org/software/make/manual/html_node/Catalogue-of-Rules.html#Catalogue-of-Rules) для make могут выяснить, что вам нужно для большинства простых случаев. – jkerian

1

Во всех случаях, вы просто делаете

make prog 

или просто

make 

Идея иметь в Makefile, что make может исследовать зависимости, выяснить, что устаревает, и сделать просто требуемая перекомпиляция (и не более).

Если изменить .c файл, очевидно, это будет перекомпилировать этот .c файл, и потому, что это обновляет .o файл, на котором prog зависит, он также будет перелинковать prog.

Если вы изменили файл .h, это приведет к перекомпиляции одного или нескольких файлов .c, что также приведет к перезагрузке prog.

Смежные вопросы