gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:08:03 30 4
gpt4 key购买 nike

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

检查以确保宏 ARARFLAGS 设置正确(arru 或附近 —我通常使用ruv)。

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

如果你想在库中有更多的目标文件,那么定义:

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

并在规则中使用 $(OBJECT) 代替 $(NAME).o。就我个人而言,我不相信通配符——为了让我感到舒服,测试程序代码等被包含在库中的危险太大了。 YMMV.

关于c - 如何在 Makefile 中创建静态库和动态库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41294878/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com