Предполагается, что вы используете GNU Make ...
Используйте шаблонное правило, например:
obj/%.o: %.c
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
, чтобы сообщить make
, что объектный файл obj/<name>.o
должен быть скомпилирован из исходного файла <name>.c
В сочетании с этим используйте специальную переменную VPATH
, чтобы сообщить make
о каталогах, в которых он должен искать любые<name>.c
, если его нет в текущем каталоге.
Кроме того, добавьте обязательное условие только для заказа в правило шаблона, чтобы убедиться, что каталог (obj
), к которому относится ваш каталог.Объектные файлы скомпилированы существуют при необходимости:
obj/%.o: %.c | obj
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
Так, например, со структурой проекта:
./
-- Makefile
-- aa/
-- main.c
-- bb/
-- foo.c
-- obj/ #<-- Compile object files in here
-- prog #<- program to be built
И:
Makefile
VPATH := aa:bb
SRCS := foo.c main.c
OBJS := $(addprefix obj/, $(SRCS:.c=.o))
.PHONY: all clean
all: prog
prog: $(OBJS)
$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
obj/%.o: %.c | obj
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
obj:
mkdir $@
clean:
$(RM) $(OBJS) prog
сборка работает так:
$ make
cc -c -o obj/foo.o bb/foo.c
cc -c -o obj/main.o aa/main.c
cc -o prog obj/foo.o obj/main.o