我正在尝试编译动态库,我需要将文件存储在单独的文件夹中。
然后,我将隐式规则用于对象编译。然后,此规则从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
不匹配... 最佳答案
根据您对事物的定义,
$(OBJDIR)/%.o: $(LIBSRC)/%.c
应该
$(OBJDIR)/%.o: $(LIBSRC_DIR)/%.c
关于c++ - 在单独的文件夹中编译对象,隐式规则不匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26364479/