gpt4 book ai didi

unix - ar 在现有的 .a 文件上?

转载 作者:行者123 更新时间:2023-12-01 11:57:58 24 4
gpt4 key购买 nike

本质上,我想做的是:

gcc foo.c -o foo.o
ar rcs foo.a foo.o
gcc bar.c -o boo.o
ar rcs bar.a bar.o foo.a

我想将对象和静态库都存档到另一个静态库中。不幸的是,最后一个命令并没有包含 foo.o(它包含 bar.o 和 foo.a),所以当我进入链接阶段时,链接器无法从 foo.o 中找到符号。

有没有办法在这里做我想做的事?我正在做所有这些事情,所以我正在寻找一种不涉及提取和重新归档对象的解决方案(这似乎有点痛苦)。有没有办法使这种“从另一个存档存档”设置工作?

最佳答案

实际上,您不想将整个“.a”文件归档到另一个文件中。您可能希望将一个文件的成员归档到另一个文件中 - 但这是完全不同的操作。

'ar' 程序完全能够将源文件、gzip 压缩的 tar 文件、HTML 文件、XML 文件和几乎所有其他类型的文件存储在 '.a' 中(并且 '.a' 后缀仅常规的,不是强制性的)- 尝试一下。但是,它会特殊处理目标文件(且仅是目标文件),并使它们可供链接器使用 ('ld'),但链接器仅在扩展名为 '.a' 时才使用此类文件。

所以,你想要两个库:

  1. foo.a 只包含 foo.o
  2. bar.a 包含 bar.ofoo.a
  3. 中的所有对象

除了按照您的建议从 foo.a 中提取对象并将它们构建到 bar.a 中之外,唯一的选择是列出 的成员>foo.a 也是 bar.a 的成员:

FOO_OBJS = foo.o
BAR_OBJS = bar.o $(FOO_OBJS)

foo.a: $(FOO_OBJS)
$(AR) $(ARFLAGS) $@ $(FOO_OBJS)
bar.a: $(BAR_OBJS)
$(AR) $(ARFLAGS) $@ $(BAR_OBJS)

我假设您的示例已最小化。如果不是,那么为什么要费心使用两个库。任何仅使用 foo.o 代码的东西都只会链接 foo.o,即使给定 bar.a 链接也是如此。 (如果这些是共享对象,情况会略有不同,但只使用一个而不是两个共享对象可能会更好。)

关于unix - ar 在现有的 .a 文件上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4318906/

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