我有2个静态Linux库,由ar cr
,libabc.a
和libxyz.a
创建。
我想将它们合并到一个静态库libaz.a
中
我怎么能这样做。
我想创建一个合并的静态库,而不是将两个库都提供给应用程序的最终链接。
答案 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