如何将两个“ar”静态库合并为一个
我有2个静态Linux库,由ar cr
, libabc.a
和libxyz.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
这样链接器将为您处理所有的事情!