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 не отслеживает зависимости от заголовочных файлов. Это может быть сделано автоматически, но это Тонкий трюк; это может подождать, пока вы не освоите это.