gpt4 book ai didi

c - GNU 使用 stem 制定隐式归档规则

转载 作者:太空狗 更新时间:2023-10-29 15:04:05 27 4
gpt4 key购买 nike

我正在尝试设置 Makefile 以根据目标文件扩展名构建静态 (.a) 和动态 (.so) 库。

我以前只将以下 Makefile 用于静态库:

NAME   := config
LIB := lib$(NAME).a
SRC := $(wildcard *.c)
OBJ := $(SRC:.c=.o)
CFLAGS += -W -Wall

.PHONY: all clean fclean re

all: $(LIB)

clean:
@$(RM) $(OBJ)

fclean: clean
@$(RM) $(LIB)

re: fclean all

$(LIB): $(LIB)($(OBJ))
ranlib $@

我的主要目标是能够通过仅更改 LIBNAME 变量来编译多个库。

一切正常,所以我为动态库添加了以下内容:

LDFLAGS += -shared

%.so: CFLAGS += -fPIC
%.so: $(OBJ)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^

并通过以下通用规则更改了 $(LIB): 规则:

%.a: %.a($(OBJ))
ranlib $@

如果我将 LIB 更改为 lib$(NAME).so 一切都按预期工作,但使用 .a 扩展名,打印我这个错误:

制作:*** 没有制作目标“libconfig.a”的规则,“全部”需要。停止。

我找到的唯一解决方案是添加另一个显式规则:

%.a($(OBJ)): $(OBJ)
$(AR) rv $@ $^

现在一切正常。

但添加此显式规则可防止我仅依赖 GNU make 的隐式规则,并使我显式调用 ar,这是我想避免的。

这是某种错误还是我遗漏了什么?

GNU Make 3.82
Built for x86_64-unknown-linux-gnu

最佳答案

一些快速测试似乎表明这无法完成。专门的 make 存档支持似乎是一个 makefile 解析时间功能。也就是说,文字存档名称必须存在于实际的 makefile 中才能生效。

我尝试了几种变通方法,但无法使它们中的任何一种正常工作。我能做到的最接近的是:

$(foreach a,$(filter %.a,$(MAKECMDGOALS) $(.DEFAULT_GOAL)),$(eval $a: $a($$(OBJ)); ranlib $$@))

它不适用于 all 的默认目标,但如果默认目标是库名称和/或如果库名称是显式 make 目标,则可以。您也可以在其中粘贴任何其他已知的库名称,然后它们甚至可以作为其他目标的隐式要求工作,但这是一个手动过程。

关于c - GNU 使用 stem 制定隐式归档规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22662501/

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