2014-10-14 2 views
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 ...

ответ

1

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

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

должно быть

$(OBJDIR)/%.o: $(LIBSRC_DIR)/%.c 
+0

Все было. Благодарю. * чувствует себя немым * – valentin

Смежные вопросы