Makefile: автоматически компилировать все файлы c, сохраняя.o файлы в отдельной папке

Я искал это в течение нескольких часов, но почему-то я до сих пор не нашел то, что работает для меня.

У меня есть каталог с 3 подкаталогами. src / for .с и. H файлы, bin / куда должен идти скомпилированный исполняемый файл и obj / где я хочу .obj-файлы, чтобы пойти.

теперь я хочу, чтобы каждый компилировать .c файл из src (без необходимости перечислять их все в файле makefile )и поставить.o файлы в obj и исполняемый файл, построенный из foo.с сохранено как bin / foo.

может кто-нибудь помочь мне? Всякий раз, когда я использую подстановочные знаки, make жалуется на отсутствие правил, а когда я использую неявные правила, он не помещает объектные файлы в отдельную папку.

1 ответов


построить foo.o С foo.c локально:

foo.o: foo.c
    $(CC) -c $< -o $@

сделать то же самое, но с любыми необходимыми файлами заголовков в src/:

SRC := src

foo.o: foo.c
    $(CC) -I$(SRC) -c $< -o $@

сделать то же самое, но с исходным файлом в src/:

SRC := src

foo.o: $(SRC)/foo.c
    $(CC) -I$(SRC) -c $< -o $@

для этого, но поместите объектный файл в obj/:

SRC := src
OBJ := obj

$(OBJ)/foo.o: $(SRC)/foo.c
    $(CC) -I$(SRC) -c $< -o $@

правило шаблона, которое будет делать это для любого такого объектного файла (obj/foo.o, obj/bar.o, ...):

SRC := src
OBJ := obj

$(OBJ)/%.o: $(SRC)/%.c
    $(CC) -I$(SRC) -c $< -o $@

создать список желаемых объекты:

SOURCES := $(wildcard $(SRC)/*.c)
OBJECTS := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES))

и правило, чтобы охватить их все:

all: $(OBJECTS)

собираем все вместе:

SRC := src
OBJ := obj

SOURCES := $(wildcard $(SRC)/*.c)
OBJECTS := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES))

all: $(OBJECTS)
    $(CC) $^ -o $@

$(OBJ)/%.o: $(SRC)/%.c
    $(CC) -I$(SRC) -c $< -o $@

обратите внимание, что это имеет один большой недостаток: is не отслеживает зависимости от заголовочных файлов. Это может быть сделано автоматически, но это Тонкий трюк; это может подождать, пока вы не освоите это.