使用一个Makefile构建多个共享库
Building multiple shared libraries with one Makefile
我正试图在一个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
相关文章:
- 为 Python 构建共享库C++时出现分段错误
- 如何在 Linux 中构建共享库时使未定义引用的链接器失败
- 从单个.cpp构建共享对象
- 从静态库构建共享库
- 使用 Makefile 构建共享库
- 我可以在Embarcadero C 建造者中为Android(*.so)构建共享库
- setuptools:从C++代码构建共享库,然后构建链接到共享库的 Cython 包装器
- 构建共享对象 - 使用 Ninja 编译适用于 OSX 和 Windows 上的 Ubuntu Crush
- 使用boost :: python手动构建共享对象
- JNI 使用静态 NTL 库构建共享库
- Libtool 在构建共享库时会丢弃静态库
- 使用 C/C++ 以外的语言构建共享库,特别是 prolog
- Eclipse,构建共享库的最佳方式
- OSX Scons构建共享库:体系结构x86_64的未定义符号
- Android NDK构建共享库-中止-停止.local_module_filename不能包含文件扩展名
- 构建共享的帕尔梅蒂斯-4.0.3
- 在linux中使用另一个共享库构建共享库
- 确定用于在*ix操作系统上构建共享对象的编译器和版本
- 未能使用boost 1.48构建共享库
- Qt保持构建共享构建无论我选择什么选项