2016-12-23 59 views
0

如何在Makefile中创建动态和静态库。我有C代码。在inc文件夹中包含所有包含的头文件以及此文件夹外的C文件。我想创建.a和.so库。我如何包含通配符来说明所有的文件将被执行。 我试过这种方式。如何在Makefile中创建静态和动态库?

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

发布的makefile只会生成一个.so库。您需要添加第一个目标,类似于:'all:lib $(NAME).so。$(VERSION)lib $(NAME).a。$(VERSION)'然后编写一个额外的配方来生成静态库(lib $(NAME).a。$(VERSION) – user3629249

回答

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* 

检查,以确保宏ARARFLAGS适当设置(arru点左右 - 我通常使用ruv)。

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

如果你想在库的详细目标文件,然后定义:

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

,并在规则中使用$(OBJECT)代替$(NAME).o。就个人而言,我不相信通配符 - 测试程序代码等被包含在库中的风险太大,我的安慰。因人而异。

+0

感谢它的工作:) – Dulguuntur