ar在现有的.a文件中?

时间:2010-11-30 21:33:18

标签: unix gcc makefile archive

基本上,我想要做的是:

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中找到符号。

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

2 个答案:

答案 0 :(得分:3)

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

'ar'程序完全能够存储源文件,gzipped tar文件,HTML文件,XML文件以及'.a'中的几乎任何其他类型的文件(并且'.a'后缀仅是传统的,非强制性的 - 尝试一下。但是,它专门处理目标文件(并且只处理目标文件),并使它们可供链接器('ld')使用,但如果扩展名为'.a',链接器仅使用此类文件。

所以,你想拥有两个库:

  1. foo.a仅包含foo.o
  2. bar.a包含bar.o以及foo.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来链接。 (如果这些是共享对象,情况会略有不同,但仅使用一个而不是两个共享对象可能会更好。)

答案 1 :(得分:2)

ar rcs foo.a foo.o
cp foo.a foo2.a
gcc -c bar.c
ar rs foo2.a bar.o

如果您不需要将其保留为原始格式,也许可以使用foo.a代替foo2.a