如何在 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*
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.
我是一名优秀的程序员,十分优秀!