2013-11-29 4 views
1

Вопрос: для foo.c, a .c файл, используемый в другом месте в более крупном проекте, должен ли целевой объект компиляции объекта foo.o в списке Makefile foo.h в качестве зависимости?При использовании make, если объектный файл зависит от собственного файла заголовка?

foo.o: foo.c foo.h 
    $(CC) $(CFLAGS) -c -o foo.o foo.c 

Это просто вопрос согласия?

Это мое мышление до сих пор, и удар в ответ:

Похоже, что любое законное изменение в foo.h потребует внесения соответствующих изменений в foo.c. Таким образом, нет необходимости перечислять foo.h в качестве зависимости. Однако это, вероятно, хорошая идея, так как мы хотим, чтобы вас немедленно уведомили (с помощью перекомпиляции), если изменение foo.h сломало что-либо в foo.c.

+0

от того, что я знаю, если вы определяете правило something.o make будет автоматически строить something.c с something.h как зависимость, вы можете проверить его, хотя. – cerkiewny

+2

Существуют различные изменения в заголовке, которые требуют восстановления исходного файла, но не требуют изменения кода. например обновление элементов ## define или re-ordering структуры. Обработка заголовка в качестве зависимости позволяет автоматически перестраивать соответствующий код. – simonc

+0

Gnu make неявно добавляет соответствующие файлы '.h' в зависимости. Он является частью списка [суффикс по умолчанию] (http://www.gnu.org/software/make/manual/html_node/Catalogue-of-Rules.html). Вы должны будете перенести это правило явно, если вы не хотите, чтобы он был частью зависимостей. – Lucas

ответ

5

Вполне возможно иметь изменения в заголовочных файлах, которые не требуют изменений в .c-файлах. Например, изменение значений констант и т. Д.

Вы всегда хотите поместить все файлы заголовков, используемые исходным файлом, в качестве обязательного условия для объектного файла.

+0

Ах, использование констант (как вы указали) является хорошим примером, который проливает свет на ситуацию. Это то, что я ищу ... Можете ли вы (или кто-либо еще) подумать о других? –

+0

Макросы в C, которые заменяют встроенные функции на C++. – bmargulies

+1

Некоторые изменения типов могут не требовать изменений кода; например int to unsigned или наоборот. Добавление или удаление #include в файле заголовка может не потребовать изменения кода. Очевидно, что в C++ есть много возможностей. – MadScientist