【问题标题】:Extract object (*.o) files from an iPhone static library从 iPhone 静态库中提取对象 (*.o) 文件
【发布时间】:2011-06-02 12:02:20
【问题描述】:

我有一组 iPhone 静态库(一个 *.a 文件),我只调用其中的几个类。 我过去曾使用 AR(使用 linux 库)从静态库中提取目标文件,删除不需要的目标文件并重新归档。

但是,当我使用 iPhone 编译的静态库尝试此操作时,我收到以下错误:

ar: CustomiPhoneLib.a is a fat file (use libtool(1) or lipo(1) and ar(1) on it)
ar: CustomiPhoneLib.a: Inappropriate file type or format

有谁知道如何从 iphone 编译的静态库中提取目标文件?这样做可能会减少最终文件的大小。

【问题讨论】:

    标签: iphone objective-c linux compiler-construction


    【解决方案1】:

    这是因为您的 CustomiPhoneLib.a 是一个胖库,即包含多个目标架构的库,即 iOS 上的 armv6 和 armv7。您可以使用lipo 将特定架构提取到另一个.a 文件中,使用arranlib 随意操作它,然后再次使用lipo 将操作后的.a 文件重新组合成单​​个.a脂肪文件。例如,

    lipo CustomiPhoneLib.a -thin armv6 -output CustomiPhoneLibarmv6.a
    lipo CustomiPhoneLib.a -thin armv7 -output CustomiPhoneLibarmv7.a
    ### use ar and ranlib at will on both files
    mv CustomiPhoneLib.a CustomiPhoneLib.a.original
    lipo CustomiPhoneLibarmv6.a CustomiPhoneLibarmv7.a -create -output CustomiPhoneLib.a
    

    但是,由于您提到的原因,您不必这样做。如果需要解析某些符号引用,链接器只会从库 (.a) 中提取对象 (.o) 文件。因此,如果一个库包含一个目标文件,其符号在链接过程中从未被引用(即,未有效使用的符号),该目标文件将不会使其成为可执行文件。

    【讨论】:

    • 这就是我正在寻找的确切解释!谢谢!我似乎无法通过 Google 找到类似的内容。
    • @Bavarious :Objective-C 是一种动态语言,链接器无法始终判断使用了哪些类和类别,因此,删除 lib 中不需要的对象是可以的。
    【解决方案2】:

    Code: ar -t mylib.a 这将列出存档中的所有文件。

    Code: ar -xv mylib.a myobj.o 这将从库 mylib.a 中提取对象 give myobj.o。

    【讨论】:

    • 想通了,必须先提取:lipo -thin x86_64 libtag.a -output libtag2.a,然后ar tv libtag2.a 工作
    猜你喜欢
    • 2020-02-11
    • 1970-01-01
    • 2010-12-16
    • 2015-06-15
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    相关资源
    最近更新 更多