Unix 在现有的.a文件上进行ar?

Unix 在现有的.a文件上进行ar?,unix,gcc,makefile,archive,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中找到符号 有什么办法可以满足我的要求吗?我做这些都是白手起家的,所以我正在寻找一种解决方案,它不涉及提取和重新归档对象(这似乎有点痛苦)。有没

基本上,我想做的是:

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

有什么办法可以满足我的要求吗?我做这些都是白手起家的,所以我正在寻找一种解决方案,它不涉及提取和重新归档对象(这似乎有点痛苦)。有没有办法让这种“从另一个归档文件归档”的设置生效

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

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

“ar”程序完全能够存储源文件、gzip tar文件、HTML文件、XML文件以及“.a”(和“.a”后缀只是常规的,不是强制性的)中几乎任何其他类型的文件,请稍后再试。但是,它专门处理对象文件(并且仅处理对象文件),并使它们可供链接器('ld')使用,但链接器仅在扩展名为“.a”时使用此类文件

因此,您希望有两个库:

  • foo.a
    只包含
    foo.o
  • bar.a
    包含
    bar.o
    foo.a
  • 除了按照您的建议执行并从
    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。(如果这些对象是共享对象,则会略有不同,但最好只使用一个而不是两个共享对象。)