Я пытаюсь создать несколько разделяемых библиотек в одном файле makefile. Это то, что я использую для создания одной общей библиотеки:
CC = gcc # C compiler
PWD := $(shell pwd)
CFLAGS = -fPIC -Wall -Wextra -O2 -g # C flags
LDFLAGS = -shared # linking flags
RM = rm -f # rm command
CFLAGS += $(DFLAGS)
TARGET_LIB := lib1.so # target lib
#TARGET_LIB += lib2.so
SRCS := lib1.c # source files
#SRCS += lib2.c # source files
OBJS = $(SRCS:.c=.o)
.PHONY: all
all: $(TARGET_LIB)
$(TARGET_LIB): $(OBJS)
$(CC) $(INC) $(LDFLAGS) $(CFLAGS) -o $@ $^
Тем не менее, я не могу просто раскомментировать строки для lib2 и создать его. Скорее всего, потому что $(TARGET_LIB): $(OBJS)
расширяется до lib1.so lib2.so: lib1.o lib2.o
чего я не хочу.
Вместо этого я хочу что-то вроде
lib1.so : lib1.o
lib2.so : lib2.o
Но я не уверен, как это сделать или что он называется. Может кто-нибудь сказать мне, что делать, чтобы добиться того, что я ищу?
EDIT: Я должен был быть более ясным. Я понимаю, что вы можете добавить больше целей для их создания. Но есть ли способ сделать это без необходимости писать новую цель каждый раз, когда я хочу добавить новую библиотеку?
Благодарю.
Вы можете сделать что-то вроде этого -
все: lib1.so lib2.so
и предоставить правила для создания lib1.so и lib2.so
Для этого подразумеваются неявные правила. Читайте о них в руководстве GNU.
замещать
$(TARGET_LIB): $(OBJS)
с
%.so: %.c
Вы можете разделить источники двух библиотек на разные каталоги. Это также может помочь в дальнейшем обслуживании ваших библиотек. Затем используйте один файл make, который вызывает соответствующие суб файлы. Я могу быть лучше, чем один большой файл makefile
Вы можете сделать это, разделив цели следующим образом:
CC = gcc # C compiler
PWD := $(shell pwd)
CFLAGS = -fPIC -Wall -Wextra -O2 -g # C flags
LDFLAGS = -shared # linking flags
RM = rm -f # rm command
CFLAGS += $(DFLAGS)
TARGET_LIB1 = lib1.so # target lib
TARGET_LIB2 = lib2.so
TARGET_LIBS = $(TARGET_LIB1) $(TARGET_LIB2)
SRCS1 = lib1.c # source files
SRCS2 = lib2.c # source files
SRCS = $(SRCS1) $(SRCS2)
OBJS1 = $(SRCS1:.c=.o)
OBJS2 = $(SRCS2:.c=.o)
OBJS = $(OBJS1) $(OBJS2)
.PHONY: all
all: $(TARGET_LIBS)
$(TARGET_LIB1): $(OBJS1)
$(CC) $(INC) $(LDFLAGS) $(CFLAGS) -o $@ $^
$(TARGET_LIB2): $(OBJS2)
$(CC) $(INC) $(LDFLAGS) $(CFLAGS) -o $@ $^