2011-11-17 42 views
36

我试过了这个question的方法,但是似乎linux版本的ar和mac版本不一样,因为我没有再次合并目标文件。组合静态库

我基本上想要做的是通过运行脚本构建阶段将另一个静态库合并到我的Xcode静态库构建产品中。

不幸的是,我不能将其他库直接编译到我的项目中,因为它有它自己的编译系统(因此我使用编译的库)。

我认为应该可以通过ar合并另一个库到Xcode生成的库中,而无需反编译构建产品。我该如何做到这一点?

回答

62

可以使用libtool

libtool -static -o new.a old1.a old2.a 
+2

这实际上比'ar'更好的解决方案。谢谢! –

+0

我可以在哪里运行? –

+0

任何命令行(bash),如果你有开发者的扩展,你应该在PATH中有libtool。或者,作为xcode中的后期构建步骤。 – Bruce

0

你应该能够将一个链接到另一个。所以...只需使用ld即可合并图像。

0

您应该使用ar -r建立在MacOS档案:

ar -x libabc.a 
ar -x libxyz.a 
ar -r libaz.a *.o 
+0

这根本不起作用。您将覆盖具有相同.o名称的文件。 –

3

如果你处理的多架构的静态库,有点需要额外的操作来精简每个库,合并细化的版本,然后增加结果。这里有一个方便的脚本,您可以编辑它来满足您的需求,并且可以一次完成所有功能。该示例使用三个iOS库path/to/source/libs/libone.a,path/to/source/libs/libtwo.apath/to/source/libs/libthree.a,并将它们合并到单个库libcombined.a中。

#! /bin/bash 

INPATH="path/to/source/libs" 

LIBPREFIX="lib" 
LIBS="one two three" 
LIBEXT=".a" 

OUT="combined" 

ARCHS="armv7 armv7s arm64" 

for arch in $ARCHS 
do 
    for lib in $LIBS 
    do 
    lipo -extract $arch $INPATH/$LIBPREFIX$lib$LIBEXT -o $LIBPREFIX$lib-$arch$LIBEXT 
    done 
    INLIBS=`eval echo $LIBPREFIX\{${LIBS// /,}\}-$arch$LIBEXT` 
    libtool -static -o $LIBPREFIX$OUT-$arch$LIBEXT $INLIBS 
    rm $INLIBS 
done 

OUTLIBS=`eval echo $LIBPREFIX$OUT-\{${ARCHS// /,}\}$LIBEXT` 
lipo -create $OUTLIBS -o $LIBPREFIX$OUT$LIBEXT 
rm $OUTLIBS