мой основной 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)
, но я чувствую, что он вызывает компилятор два раза без необходимости тогда?