基本上,我想要做的是:
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中找到符号。
有没有办法在这里做我想做的事情?我正在做所有这些,所以我正在寻找一个不涉及提取和解决方案的解决方案。重新存档对象(这似乎有点痛苦)。有没有办法让这种“归档来自另一个档案”设置工作?
答案 0 :(得分:3)
实际上,您不希望将一个“.a”文件存档到另一个文件中。您可能希望将另一个存档的成员存档到另一个存档中 - 但这是完全不同的操作。
'ar'程序完全能够存储源文件,gzipped 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来链接。 (如果这些是共享对象,情况会略有不同,但仅使用一个而不是两个共享对象可能会更好。)
答案 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
。