如何在Makefile中创建动态和静态库。我有C代码。在inc文件夹中,包含所有头文件,并且包含此文件夹C文件之外。我想创建.a和.so库。如何包含说明所有文件将被执行的通配符。 我试过这种方式。
CFLAGS := -fPIC -O3 -g -Wall -Werror
CC := gcc
MAJOR := 0
MINOR := 1
NAME := foo
VERSION := $(MAJOR).$(MINOR)
lib: lib$(NAME).so
lib$(NAME).so.$(VERSION): $(NAME).o
$(CC) -shared -Wl,-soname,lib$(NAME).so.$(MAJOR) $^ -o $(wildcard %.c)
clean:
$(RM) *.o *.so*
答案 0 :(得分:2)
CFLAGS := -fPIC -O3 -g -Wall -Werror
CC := gcc
MAJOR := 0
MINOR := 1
NAME := foo
VERSION := $(MAJOR).$(MINOR)
LIBSO = lib$(NAME).so
LIBSOM = $(LIBSO).$(MAJOR)
LIBSOV = $(LIBSO).$(VERSION)
LIBA = lib$(NAME).a
lib: $(LIBSO) $(LIBA)
$(LIBSO): $(LIBSOV)
ln -s $(LIBSOV) $(LIBSO)
$(LIBSOV): $(NAME).o
$(CC) $(CFLAGS) -shared -Wl,-soname,$(LIBSOM) -o $(LIBSOV) $(NAME).o
$(LIBA): $(NAME).o
$(AR) $(ARFLAGS) $(LIBA) $(NAME).o
clean:
$(RM) *.o *.so*
检查以确保正确设置AR
和ARFLAGS
(ar
和ru
或其左右 - 我通常使用ruv
)。
我不清楚为什么你有一个目标文件foo.o
,或者实际上你是否希望目录中的每个C源文件都编译成一个目标文件并包含在库中 - 你的链接命令因为共享对象格式不正确(它会覆盖第一个.c
文件作为它创建的共享对象。)
如果您想在库中有更多目标文件,请定义:
SOURCE := $(wildcard *.c)
OBJECT := $(SOURCE:.c=.o)
并在规则中使用$(OBJECT)
代替$(NAME).o
。就个人而言,我并不信任通配符 - 为了我的安慰,图书馆中包含了太多的测试程序代码等危险。 YMMV。