При использовании make должен ли объектный файл зависеть от собственного заголовочного файла?

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

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

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

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

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


person Max Wallace    schedule 29.11.2013    source источник
comment
насколько я знаю, если вы определите правило something.o, make автоматически создаст something.c с something.h в качестве зависимости, хотя вы можете это проверить.   -  person cerkiewny    schedule 29.11.2013
comment
Существуют различные изменения в заголовке, которые требуют перестроения исходного файла, но не требуют изменения кода. например обновление #define или изменение порядка членов структуры. Обработка заголовка как зависимости позволяет автоматически перестраивать соответствующий код.   -  person simonc    schedule 29.11.2013
comment
Gnu make неявно добавит соответствующий файл .h к зависимостям. Он является частью списка суффиксов по умолчанию. . Вам придется явно перезаписать это правило, если вы не хотите, чтобы оно было частью зависимостей.   -  person Lucas    schedule 29.11.2013
comment
Лукас: это неправда. Заголовки не добавляются автоматически по правилам по умолчанию. Это было бы катастрофой, потому что определенно не требуется, чтобы каждый исходный файл имел соответствующий заголовочный файл. Многие этого не делают.   -  person MadScientist    schedule 29.11.2013
comment
@MadScientist: Похоже, вы правы, заголовки не входят в правила по умолчанию. Но я не думаю, что добавление их в правила по умолчанию было бы катастрофой. Если файл .h отсутствует, он просто будет проигнорирован. Вы также можете добавить это правило следующим образом: %.o: %.c %.h $(COMPILE.c) $(OUTPUT_OPTION) $< (с переносом строки после %.h, но комментарии не позволяют мне это сделать).   -  person Lucas    schedule 30.11.2013
comment
Это абсолютно не будет проигнорировано. Make не может игнорировать определенное предварительное условие! Что произойдет, так это то, что, поскольку нет файла, соответствующего предпосылке %.h, а make не знает, как его создать, make решит, что это неявное правило не соответствует, и перейдет к следующему неявному правилу. Если нет другого подходящего правила, make не выдаст сообщение об отсутствии правила для создания цели foo.o. Что бы сработало, так это объявить make два неявных правила: первое с пререквизитом %.h, а другое без него. Однако это не так, и в этом нет никакого смысла.   -  person MadScientist    schedule 30.11.2013
comment
@MadScientist: Вы, скорее всего, правы. Извините, за путаницу.   -  person Lucas    schedule 30.11.2013


Ответы (1)


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

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

person MadScientist    schedule 29.11.2013
comment
А, использование констант (как вы указали) — хороший пример, который проливает свет на ситуацию. Это то, что я ищу ... можете ли вы (или кто-нибудь еще) придумать что-нибудь еще? - person Max Wallace; 29.11.2013
comment
Макросы в C, которые заменяют встроенные функции в C++. - person bmargulies; 29.11.2013
comment
Некоторые изменения типов могут не требовать изменения кода; например, int в unsigned или наоборот. Добавление или удаление #include в заголовочном файле может не требовать изменения кода. Очевидно, что в C++ НАМНОГО больше возможностей. - person MadScientist; 29.11.2013
comment
Я только что подумал еще об одном: переупорядочить элементы структуры. - person MadScientist; 20.04.2015