Компиляция объектов в отдельной папке, неявное правило не соответствует

0

Я пытаюсь скомпилировать динамическую библиотеку, и мне нужно, чтобы мои инструменты были сохранены в отдельной папке.

Затем я использую неявное правило для компиляции объектов. Это правило начинается с макроса OBJDIR.

Вот Makefile:

ifndef LOGIN
LOGIN=login_x
endif

RM=rm -rvf

CC=gcc
CFLAGS=-std=c99 -Wall -Wextra -std=c99 -pedantic
LDFLAGS=-fpic
DEBUGFLAGS=-g3 -ggdb3

BUILD_DIR=bin
LIBS_DIR=$(BUILD_DIR)/lib
OBJDIR=$(LIBS_DIR)/$(LOGIN)
TARGET=$(LIBS_DIR)/lib$(LOGIN).so

ifdef LIBSRC_DIR
LIBSRC=$(shell echo $(LIBSRC_DIR)/*.c)
LIBOBJ=$(addprefix $(OBJDIR)/, $(LIBSRC:$(LIBSRC_DIR)/%.c=%.o))
endif

.PHONY: clean

all:
    @echo "Nothing was done."

lib: $(LIBS_DIR) $(OBJDIR) $(LIBOBJ)
ifndef LIBSRC_DIR
    @echo "Error making $(TARGET), LIBSRC_DIR (path to the source files) must be defined"
    @false
endif
    @echo $(OBJDIR)
    $(CC) --shared -o $(TARGET) $(LIBOBJ)

$(OBJDIR)/%.o: $(LIBSRC)/%.c
    $(CC) $(CFLAGS) $(LDFLAGS) $(DEBUGFLAGS) -c -o $(OBJDIR)/$(@:$(LIBSRC_DIR)/%=%) $(@:.o=.c)

$(OBJDIR):
    mkdir -vp $(OBJDIR)

$(LIBS_DIR):
    mkdir -vp $(LIBS_DIR)

clean:
    $(RM) $(BUILD_DIR)/*

И я получаю:

make: *** No rule to make target 'bin/lib/login_x/array.o', needed by 'lib'.  Stop.

Не могу понять, почему $(OBJDIR)/%.o: $(LIBSRC)/%.c не соответствует bin/lib/login_x/array.o...

Теги:
makefile

1 ответ

1
Лучший ответ

Основываясь на том, как вы определяете вещи,

$(OBJDIR)/%.o: $(LIBSRC)/%.c

должно быть

$(OBJDIR)/%.o: $(LIBSRC_DIR)/%.c
  • 0
    Вот и все. Благодарю. чувствует себя глупым

Ещё вопросы

Сообщество Overcoder
Наверх
Меню