我试图在一个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
但我不确定该怎么做或它叫什么。有人能告诉我该怎样做才能实现我想要的目标吗?
编辑:我应该更清楚。我意识到你可以添加更多目标来构建这些目标。但有没有办法在没有每次我想添加新库的情况下编写新目标时这样做?感谢。
答案 0 :(得分:2)
你可以这样做 -
all:lib1.so lib2.so
并提供制作lib1.so和lib2.so
的规则答案 1 :(得分:0)
你可以通过分离这样的目标来实现:
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 $@ $^
答案 2 :(得分:0)
您可以将两个库的源分成不同的目录。它还可能有助于进一步维护您的库。然后使用一个make文件,它将触发相应的子makefile。我可能比一个大的makefile更好
答案 3 :(得分:0)
隐含的规则就是为此。在GNU Make手册中阅读它们。
替换
$(TARGET_LIB): $(OBJS)
与
%.so: %.c