使用一个Makefile构建多个共享库

Building multiple shared libraries with one Makefile

本文关键字:构建 共享 Makefile 一个      更新时间:2023-10-16

我正试图在一个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

但我不知道该怎么做,也不知道它叫什么。有人能告诉我该怎么做才能实现我想要的目标吗?

编辑:我应该更清楚一点。我意识到你可以添加更多的目标来构建这些。但是,有没有一种方法可以做到这一点,而不必每次我想添加新库时都写一个新的目标?

谢谢。

你可以做这样的事情-

all:lib1.so lib2.so

并提供使lib1.so和lib2.so成为的规则

您可以将两个库的源分离到不同的目录中。它还可能有助于进一步维护您的库。然后使用一个生成文件,该文件将触发相应的子生成文件。我可能比一个大的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 $@ $^

隐式规则就是这样。请参阅GNUMake手册中的相关内容。

更换

$(TARGET_LIB): $(OBJS)

带有

%.so: %.c