如何在makefile中创建动态和静态库。我有C代码。在INC文件夹中,包含所有标头文件,并且包含此文件夹C文件之外。我想创建.a and .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*
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
或THEREBOUTS - 我通常使用ruv
)。
我不清楚为什么您有一个对象文件 foo.o
,或者实际上您是否想要编译到对象文件中并包含在库中的目录中的每个c源文件 - 共享对象的链接命令不是形成良好(它将第一个.c
文件作为其创建的共享对象覆盖)。
如果要在库中使用更多对象文件,请定义:
SOURCE := $(wildcard *.c)
OBJECT := $(SOURCE:.c=.o)
并在规则中使用$(OBJECT)
代替$(NAME).o
。就我个人而言,我不信任通配符 - 为了我的舒适,在图书馆中包含了测试程序代码等的危险。ymmv。