【问题标题】:Combine static libraries on Apple在 Apple 上合并静态库
【发布时间】:2011-12-31 12:15:03
【问题描述】:

我尝试了question中的方法,但似乎ar的linux版本与mac版本不一样,因为我未能再次合并目标文件。

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

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

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

【问题讨论】:

    标签: objective-c c xcode static-libraries


    【解决方案1】:

    你可以使用libtool来做

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

    【讨论】:

    • 这其实是比ar更好的解决方案。谢谢!
    • 任何命令行 (bash),只要你有开发者的扩展名,你应该在 PATH 中有 libtool。或者,作为 xcode 中的后期构建步骤。
    • 您需要下载并安装libtool。这是在 Xcode 的命令行工具中。
    • @MohamMad 我已将此调用添加为构建阶段脚本。更多详情stackoverflow.com/a/21225126/239408
    • 这正是我所需要的。将其添加为 XCode 中的运行脚本构建步骤,并像魅力一样工作。谢谢。
    【解决方案2】:

    如果您正在处理多架构静态库,则需要进行一些额外的操作来精简每个库,组合精简后的版本,然后使结果变肥。这是一个方便的脚本,您可以对其进行编辑以满足您的需求,它可以一次性完成所有操作。该示例采用三个 iOS 库 path/to/source/libs/libone.a、path/to/source/libs/libtwo.a 和 path/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
    

    【讨论】:

      【解决方案3】:

      您应该使用ar -r 在 MacOS 上创建存档:

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

      【讨论】:

      • 这根本不起作用。您将覆盖具有相同 .o 名称的文件。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2012-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多