2011-12-19 4 views
0

Так как файлы * .o, * .h и * .c хранятся в разных каталогах, мне нужно добавлять префикс $ (ODIR) или $ (IDIR) каждый раз, когда я пишу a * .o или * .h файл?makefile содержит * .h файл в другом каталоге

Есть ли изящный способ сделать это?

Возможно, что-то вроде $ (IDIR)/{a.h, b.h, c.h}?

Это образец Makefile:

GCC = gcc 
CFLAGS = 
CFLAGS_DEBUG_STRICT = -Wall pedantic -ansi -ggdb -DDEBUG 
CFLAGS_DEBUG = -Wall -ggdb -DDEBUG 
LFLAGS = 
SDIR = ../src 
ODIR = obj 
IDIR = ../include 
INCLUDES = 
LIDR = ../lib/ 
LIBS = 
all : keyword_match_test 
keyword_match_test : $(ODIR)/keyword_match_test.o $(ODIR)/keyword_match.o 
    $(GCC) $(CFLAGS_DEBUG) -o [email protected] $+ 

$(ODIR)/keyword_match_test.o : keyword_match_test.c $(IDIR)/keyword_match.h 
    $(GCC) $(CFLAGS_DEBUG) -c -o [email protected] $< -I$(IDIR) 

$(ODIR)/keyword_match.o : $(SDIR)/keyword_match.c $(IDIR)/keyword_match.h $(IDIR)/global.h 
    $(GCC) $(CFLAGS_DEBUG) -c -o [email protected] $< -I/usr/include/mysql -I$(IDIR) 
+0

http://mad-scientist.net/make/rules.html#rule3 – eriktous

ответ

1

В дополнение к предложению @macs с явно размещенных объектных файлов, директива VPATH GNU Make может помочь вам:

vpath %.h $(IDIR) 
vpath %.o $(ODIR) 

$(ODIR)/keyword_match_test.o : keyword_match_test.c keyword_match.h 
+0

Вы читали http://mad-scientist.net/make/vpath.html? – eriktous

0

Вы можете сделать что-то вроде этого:

C_SRC = foo.c bar.c 
C_OBJ = $(C_SRC:%.c=../obj/%.o) 
INCLUDES = $(wildcard *.hpp) $(wildcard *.h) $(wildcard ../../general/*.hpp) 

$(C_OBJ): $(C_SRC) 
      $(C) $(CFLAGS) -o $(C_OBJ) -c $(C_SRC) 

Обратите внимание на ../obj/ в C_OBJ. Таким образом, вы передаете все исходные файлы в Makefile и автоматически заменяете расширения *.c на *.o и требуемый каталог. Вы можете сделать то же самое для включения или использовать подстановочный знак, как показано.

+0

Ваше правило делает каждый объектный файл зависимым от всех исходных файлов, и команда в рецепте не будет выполнена, потому что флаг '-o' принимает только один аргумент, поэтому компилятор попытается интерпретировать все следующие объектные файлы в качестве исходных файлов. – eriktous

+0

Хорошо, хорошо знать ... никогда не осознавал этого. Это не было для этого конкретного Makefile, поэтому я никогда не видел эту ошибку. Благодаря! –

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