ar cr
我有 2 个静态 Linux 库,由libabc.a
和创建libxyz.a
。
我想将它们合并到一个静态库libaz.a
中。
我怎样才能做到这一点。
我想创建一个合并的静态库,而不是将两个库都提供给应用程序的最终链接。
ar cr
我有 2 个静态 Linux 库,由libabc.a
和创建libxyz.a
。
我想将它们合并到一个静态库libaz.a
中。
我怎样才能做到这一点。
我想创建一个合并的静态库,而不是将两个库都提供给应用程序的最终链接。
至少有 3 种本地方式可以做到这一点。第一种也是最便携的方法是使用 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
您可以从两个文件中提取对象并使用提取的 s.a
创建文件:.a
.o
ar -x libabc.a
ar -x libxyz.a
ar -c libaz.a *.o
如果您只是这样做:
ar x a.a
ar x b.a
ar c c.a *.o
如果在 aa 和 ba 中都有同名的成员,您将丢失一些目标文件,因此,您需要将不同档案的成员提取到不同的文件夹中:
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
这样,链接器将为您处理所有事情!
更好的是,您对每个库执行部分链接,然后它们会生成两个生成的目标文件的存档。这样它就可以像共享库一样运行
你做部分链接
gcc -r --nostdlib
所以不是制作中间档案,也不是在重新提取它之后,运行
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
您始终可以进行部分链接:
gcc -r -o libnew.o -Wl,--whole-archive libabc.a libxyz.a
ar cr libnew.a libnew.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
现在你有两个版本的“macroblock-10.o”
ar crsT libaz.a libabc.a libxyz.a
在这里,您创建档案档案,然后使用 T 标志“展平”(细化)结果。不确定它如何处理可能包含在其中的同名 .o 文件。
这个问题是特定于 Linux 的。如果您正在寻找如何在 macOS 上执行此操作,答案是libtool
,如此处所述:
libtool -static -o new.a old1.a old2.a