Makefile: отдельные источники и объекты - PullRequest
0 голосов
/ 04 февраля 2020

Я некоторое время пытался отделить исходные файлы моего проекта от сгенерированных объектных файлов.

Действительно, я бы хотел, чтобы мой проект был структурирован следующим образом:

obj/
    main.o
    src1.o
    [...]
src/
    main.c
    src1.c
    [...]
Makefile

Makefile, который у меня сейчас есть, выглядит следующим образом:

NAME                =       a.out

OBJ_DIR             =       "obj"
SRC_DIR             =       "src"

MAIN_SRC            =       main.c

PROJ_SRC            =       src1.c      \
                            src2.c      \
                            src3.c

MAIN_OBJ            =       $(MAIN_SRC:%.c=%.o)

PROJ_OBJ            =       $(PROJ_SRC:%.c=%.o)

CC                  =       gcc
RM                  =       rm -rf

$(NAME):            $(MAIN_OBJ) $(PROJ_OBJ)
                    $(CC) $(MAIN_OBJ) $(PROJ_OBJ) -o $(NAME)

all:                $(NAME)

clean:
                    $(RM) $(MAIN_OBJ) $(PROJ_OBJ)

fclean:             clean
                    $(RM) $(NAME)

Я пытался использовать правила шаблона , но безуспешно.

MAIN_OBJ            =       $(MAIN_SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)

PROJ_OBJ            =       $(PROJ_SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)

[...]

$(OBJ_DIR)/%.o:     $(SRC_DIR)/%.c
                    $(CC) $(CFLAGS) -c $< -o $@

Есть ли у кого-нибудь решение моей проблемы?

1 Ответ

1 голос
/ 04 февраля 2020

MAIN_SRC и PROJ_OBJ не имеют префикса каталога, поэтому выражения

$(MAIN_SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
$(PROJ_SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)

ничего не заменяют.

Исправление:

MAIN_OBJ := $(MAIN_SRC:%.c=$(OBJ_DIR)/%.o)
PROJ_OBJ := $(PROJ_SRC:%.c=$(OBJ_DIR)/%.o)

И тогда ваше шаблонное правило должно работать.

Возможно, вы захотите make создать это $(OBJ_DIR) для вас:

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
    $(CC) $(CFLAGS) -c -o $@ $<

$(OBJ_DIR) :
    mkdir -p $@

Более сложный пример для вас с автоматизированной c зависимостью заголовка поколение .

...