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

我有2个静态Linux库,由ar crlibabc.alibxyz.a
我想合并成一个静态库libaz.a
我怎样才能做到这一点。

我想创build一个合并的静态库,而不是让这两个库到应用程序的最终链接

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

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

至less有三种方法可以做到这一点。 第一个也是最便携的方法是使用libtool。 使用libtool构build其他库之后,只需将.la库添加到automake libaz_la_LIBADDvariables中,或直接从Makefile中join如下内容,就可以将它们合并:

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

另外两个在使用GNU ar时至less可用。 您可以使用MRI脚本(例如命名为libaz.mri),例如:

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

然后执行ar为:

 ar -M <libaz.mri 

或者你可以使用一个精简的归档文件(选项-T ),这将允许添加其他归档而不会将它们嵌套在内部,尽pipe缺点是如果要分发静态库,分离的对象将会丢失:

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

以上所有方法都能够正确处理原始归档中重叠的成员名称。

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

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

如果你只是这样做:

 ar x aa ar x ba ar c ca *.o 

如果在aa和ba中都有相同名称的成员,则会丢失一些目标文件,因此需要将不同存档的成员提取到不同的文件夹中:

 ar x aa && mv *.o a_objs ar x ba && mv *.o b_objs ar c ca a_objs/*.o b_objs/*.o 

进一步说,一个档案中有多个相同名字的成员(比如说aa),如果运行ar x aa ,那么只有一个同名的成员可以得到这个成员。

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

 ar xN 1 aa xxx.co && mv xxx.co xxx.c.1.o ar xN 2 ba xxx.co && mv xxx.co xxx.c.2.o ... 

这将是一个乏味的工作,所以你将不得不写一个更复杂的脚本来完成这项工作。

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

 g++ -shared -o c.so -Wl,--whole-archive aa ba 

这样链接器将为您处理所有的事情!