我有2个静态的Linux库,通过ar crlibabc.alibxyz.a创建。结果 我想将它们合并成一个静态库libaz.a。结果 我怎样才能做到这一点。

我想创建一个合并的静态库,不给这两个库的应用程序的最后一个环节。

有帮助吗?

解决方案

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

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

其他提示

有至少三种方式来做到这一点的原生。第一个也是最简单的方法是使用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为:

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

如果你简单地做它:

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节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 

这样的连接器将处理所有的事情你!

更妙的是执行上的每个库部分链接,并让它们两个生成的目标文件的归档。这样,它的操作类似于共享库将

您做部分链接与

gcc -r --nostdlib

所以无论是不是使中间归档或后 reextracting它,运行

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

然后

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

现在你有两个版本“宏块10.O”

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top