Предполагается, что неявные правила Make'а сделаны для облегчения написания Make-файлов, но если мое понимание верное, если мои файлы C зависят от любых файлов заголовков, мне нужно явно написать это правило. Я прав? Это, по-видимому, значительно снижает полезность неявных правил, поскольку большинство файлов C зависят от нескольких файлов заголовков, поэтому я подумал, что, возможно, что-то мне не хватает.Сделать неявные правила и заголовочные файлы
ответ
Вам не нужно писать правило, только зависимости. Пример:
foo.o : foo.h bar.h
Файл foo.o еще будет порождена неявным правилом, но будет иметь дополнительные зависимости foo.h
и bar.h
. Эта линия зависимостей также может быть автоматически сгенерирована большинством компиляторов.
Спасибо. Это, как минимум, снижает нагрузку! Кстати, я никогда не слышал о компиляторах, пишущих Makefiles. Как это работает? Я использую gcc 4.7.0. – Elektito
@Homaymoon: Посмотрите, например. флаг '-M' для GCC (http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html#Preprocessor-Options). –
Спасибо. -M, кажется, немного сложно использовать, хотя, по крайней мере, в несколько сложных проектах. Мне нужно предоставить все флагов, которые я обычно помещаю в Makefile, и забыть о них. Кроме того, даже при использовании -MM он выводит все заголовочные заголовки на выходе, возможно, потому, что мне пришлось добавить $ (pkg-config -cflags glib-2.0) в линию gcc. – Elektito
make
не утилита, которая идет и считывает внутри вашего файла C и определяет, какой заголовок он включает. Он работает на основе измененных временных файлов. Следовательно, независимо от того, зависит ли цель от заголовка или любого другого файла, вам нужно явно указать make
зависимостей.
gcc
может помочь вам облегчить свою работу, создавая список из зависимостей для вас нравится эта
main.C
#include<stdio.h>
#include"my_header.h"
int main()
{
return 0;
}
А потом,
gcc -M main.c
Теперь, с -M
preprocessor, он автоматически генерирует список зависимостей, например
main.o: main.c /usr/include/stdio.h /usr/include/features.h \
/usr/include/bits/predefs.h /usr/include/sys/cdefs.h \
/usr/include/bits/wordsize.h /usr/include/gnu/stubs.h \
/usr/include/gnu/stubs-64.h \
/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/include/stddef.h \
/usr/include/bits/types.h /usr/include/bits/typesizes.h \
/usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/include/stdarg.h \
/usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
my_header.h
gcc
выяснил все включает в stdio.h
тоже!
Вы можете осуществлять автоматическую генерацию зависимостей заголовков с помощью GCC следующих Makefile фрагмента кода
SOURCES := $(wildcard *.c)
DEPS := $(SOURCES:%.c=%.d)
CFLAGS += -MMD
-include $(DEPS)
кода может потребоваться некоторые корректировки для работы с конкретным набором правилами.
Теперь есть хорошая идея! – Elektito
http://stackoverflow.com/a/9598716/412080 –
Ах! Клянусь, я искал Google и StackOverflow примерно полчаса и не мог найти этого! – Elektito