2012-05-09 1 views
4

Предполагается, что неявные правила Make'а сделаны для облегчения написания Make-файлов, но если мое понимание верное, если мои файлы C зависят от любых файлов заголовков, мне нужно явно написать это правило. Я прав? Это, по-видимому, значительно снижает полезность неявных правил, поскольку большинство файлов C зависят от нескольких файлов заголовков, поэтому я подумал, что, возможно, что-то мне не хватает.Сделать неявные правила и заголовочные файлы

+1

http://stackoverflow.com/a/9598716/412080 –

+0

Ах! Клянусь, я искал Google и StackOverflow примерно полчаса и не мог найти этого! – Elektito

ответ

5

Вам не нужно писать правило, только зависимости. Пример:

foo.o : foo.h bar.h 

Файл foo.o еще будет порождена неявным правилом, но будет иметь дополнительные зависимости foo.h и bar.h. Эта линия зависимостей также может быть автоматически сгенерирована большинством компиляторов.

+0

Спасибо. Это, как минимум, снижает нагрузку! Кстати, я никогда не слышал о компиляторах, пишущих Makefiles. Как это работает? Я использую gcc 4.7.0. – Elektito

+2

@Homaymoon: Посмотрите, например. флаг '-M' для GCC (http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html#Preprocessor-Options). –

+0

Спасибо. -M, кажется, немного сложно использовать, хотя, по крайней мере, в несколько сложных проектах. Мне нужно предоставить все флагов, которые я обычно помещаю в Makefile, и забыть о них. Кроме того, даже при использовании -MM он выводит все заголовочные заголовки на выходе, возможно, потому, что мне пришлось добавить $ (pkg-config -cflags glib-2.0) в линию gcc. – Elektito

2

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 тоже!

6

Вы можете осуществлять автоматическую генерацию зависимостей заголовков с помощью GCC следующих Makefile фрагмента кода

SOURCES := $(wildcard *.c) 
DEPS := $(SOURCES:%.c=%.d) 
CFLAGS += -MMD 

-include $(DEPS) 

кода может потребоваться некоторые корректировки для работы с конкретным набором правилами.

+0

Теперь есть хорошая идея! – Elektito

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

  • Нет связанных вопросов^_^