make-файл включает * .h файл в другой каталог - PullRequest
0 голосов
/ 19 декабря 2011

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

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

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

Это образец make-файла:

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 $@ $+ 

$(ODIR)/keyword_match_test.o : keyword_match_test.c $(IDIR)/keyword_match.h
  $(GCC) $(CFLAGS_DEBUG) -c -o $@ $< -I$(IDIR) 

$(ODIR)/keyword_match.o : $(SDIR)/keyword_match.c $(IDIR)/keyword_match.h  $(IDIR)/global.h
  $(GCC) $(CFLAGS_DEBUG) -c -o $@ $< -I/usr/include/mysql -I$(IDIR)

Ответы [ 2 ]

1 голос
/ 19 декабря 2011

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

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

$(ODIR)/keyword_match_test.o : keyword_match_test.c keyword_match.h
0 голосов
/ 19 декабря 2011

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

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 и требуемый каталог. Вы можете сделать то же самое для включений или использовать подстановочный знак, как показано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...