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

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

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

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

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

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

+13
источник

Посмотрите другие вопросы по меткам или Задайте вопрос