положить файлы OBJ в подкаталоге в MAKEFILE - PullRequest
0 голосов
/ 21 ноября 2018

мой основной Makefile создает .o без необходимости писать строку с gcc:

NAME = libtest.h
CC = gcc
CFLAGS = -I. -c
SRCS = example01.c \
       example02.c
OBJ = $(SRCS:.c=.o)

all: $(NAME)
$(NAME): $(OBJ)
       ar -rc $@ $<

Я полагаю, что правило $(SRCS:.c=.o) делает эквивалентный запуск $(CC) $(CFLAGS) -o $@ $<, потому что я не сделалне нужно явно вызывать компилятор?

Но потом, когда я пытаюсь сделать то же самое с добавлением подкаталога, в котором находятся файлы OBJ, он не работает:

NAME = libtest.h
CC = gcc
CFLAGS = -I. -c
SRCS = example01.c \
       example02.c
ODIR = ./builds
OBJ = $(addprefix $(ODIR)/, $(SRCS:.c=.o))

all: $(NAME)
$(NAME): $(OBJ)
       ar -rc $@ $<

Подкаталог уже существует в этом примере, конечно.Вывод ошибки: No rule to make target 'builds/example01.o', needed by 'libtest.a' Я видел решения, которые явно вызывают компилятор и имеют правило $(SRCS:.c=.o), но я чувствую, что он вызывает компилятор два раза без необходимости тогда?

1 Ответ

0 голосов
/ 21 ноября 2018

Это:

Я полагаю, что правило $ (SRCS: .c = .o) делает эквивалентное выполнению $ (CC) $ (CFLAGS) -o $ @ $ <</p>

не совсем верно.Make имеет набор встроенных шаблонных правил , которые могут применяться, если вы не определяете свое собственное правило.Один из них рассказывает, как создать файл foo.o из файла foo.c.

Но в make нет встроенного правила, объясняющего, как создать файл ./builds/foo.o из файла foo.c, поэтому вы должны указать это сами:

$(ODIR)/%.o : %.c
         $(COMPILE.c) -o $@ $<

(здесь используется встроенная переменная COMPILE.c, которая используется встроенным правилом; конечно, вы можете определить свое собственное).

...