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。(如果这些对象是共享对象,则会略有不同,但最好只使用一个而不是两个共享对象。)