如何将两个“ar”静态库合并为一个?

时间:2010-09-29 13:13:33

标签: linux static-libraries ar

我有2个静态Linux库,由ar crlibabc.alibxyz.a创建。
我想将它们合并到一个静态库libaz.a中 我怎么能这样做。

我想创建一个合并的静态库,而不是将两个库都提供给应用程序的最终链接。

8 个答案:

答案 0 :(得分:88)

至少有三种方法本地。第一种也是最便携的方法是使用libtool。在使用libtool构建其他库之后,只需将.la库添加到automake libaz_la_LIBADD变量中,或直接从Makefile中添加以下内容即可将它们组合在一起:

libtool --mode=link cc -static -o libaz.la libabc.la libxyz.la

使用GNU ar时,其他两个至少可用。您可以使用MRI脚本(例如libaz.mri命名),例如:

create libaz.a
addlib libabc.a
addlib libxyz.a
save
end

然后执行ar as:

ar -M <libaz.mri

或者您可以使用存档(选项-T),这将允许添加其他存档而不会将它们嵌套在内部,尽管缺点是如果您想要分发静态库,分离的对象将丢失:

ar -rcT libaz.a libabc.a libxyz.a

以上所有方法都能优雅地处理原始档案中的重叠成员名称。

否则,您必须解压缩到不同的目录并重新打包,以避免替换重叠的成员名称:

mkdir abc; cd abc; ar -x ../libabc.a
mkdir xyz; cd xyz; ar -x ../libxyz.a
ar -qc libaz.a abc xyz

答案 1 :(得分:48)

您可以从.a文件中提取对象,并使用提取的.a创建.o文件:

ar -x libabc.a
ar -x libxyz.a
ar -c libaz.a  *.o

答案 2 :(得分:8)

如果您只是这样做:

ar x a.a
ar x b.a
ar c c.a  *.o 

如果a.a和b.a中的成员具有相同的名称,您将丢失一些目标文件 因此,您需要将不同档案的成员提取到不同的文件夹中:

ar x a.a && mv *.o a_objs
ar x b.a && mv *.o b_objs
ar c c.a a_objs/*.o b_objs/*.o

更进一步说,一个档案中有多个同名成员(比如aa),如果你运行 ar x aa ,那么你只能得到一个成员。名。

在一个档案中提取同名的所有成员的唯一方法是通过选项'N'指定成员编号:

ar xN 1 a.a  xxx.c.o && mv xxx.c.o xxx.c.1.o
ar xN 2 b.a  xxx.c.o && mv xxx.c.o xxx.c.2.o
...

这将是一项繁琐的工作,所以你必须写一个更复杂的脚本来完成这项工作。

一个可选解决方案是您可以将多个归档合并到一个共享库中:

g++ -shared -o c.so -Wl,--whole-archive a.a b.a 
通过这种方式,链接器将为您处理所有事情!

答案 3 :(得分:0)

更好的是,您对每个库执行部分链接,它们将两个结果对象文件存档。这样,它就像共享库一样运行

您使用

做部分链接
oauth/token?client_id=client&client_secret=secret&grant_type=client_credentials

,所以而不是制作中间档案 重新提取它,运行

gcc -r --nostdlib

然后

gcc -r --nostdlib $CFLAGS $OBJECTS_A -o $LIBNAME_A.o
gcc -r --nostdlib $CFLAGS $OBJECTS_B -o $LIBNAME_B.o

答案 4 :(得分:0)

ar -x libx264.a
mkdir sub && cd sub
ar -m ../libx264.a `ar -t ../libx264.a |sort|uniq|grep "\.o"`
ar -x ../libx264.a

现在您有两个版本的“ macroblock-10.o”

答案 5 :(得分:0)

ar crsT libaz.a libabc.a libxyz.a

在这里,您创建档案的存档,然后使用T标志对结果进行“扁平化”(稀化)。 不知道它如何与可能包含在其中的同名.o文件一起工作。

答案 6 :(得分:0)

这个问题是针对 Linux 的。如果您正在寻找如何在 macOS 上执行此操作,答案是 libtool, as explained here

libtool -static -o new.a old1.a old2.a

答案 7 :(得分:0)

您始终可以进行部分链接:

gcc -r -o libnew.o -Wl,--whole-archive libabc.a libxyz.a
ar cr libnew.a libnew.o