如何在Makefile中创建静态和动态库?

时间:2016-12-23 03:43:16

标签: c makefile

如何在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*

1 个答案:

答案 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*

检查以确保正确设置ARARFLAGSarru或其左右 - 我通常使用ruv)。

我不清楚为什么你有一个目标文件foo.o,或者实际上你是否希望目录中的每个C源文件都编译成一个目标文件并包含在库中 - 你的链接命令因为共享对象格式不正确(它会覆盖第一个.c文件作为它创建的共享对象。)

如果您想在库中有更多目标文件,请定义:

SOURCE := $(wildcard *.c)
OBJECT := $(SOURCE:.c=.o)

并在规则中使用$(OBJECT)代替$(NAME).o。就个人而言,我并不信任通配符 - 为了我的安慰,图书馆中包含了太多的测试程序代码等危险。 YMMV。