我有一组 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编译的静态库中提取目标文件?这样做可能会减少最终文件的大小。
那是因为你的CustomiPhoneLib.a是一个胖库,即一个包含多个目标架构的库,即iOS上的armv6和armv7。您可以使用
lipo
将特定架构提取到另一个 .a 文件中,使用 ar
和 ranlib
对其进行随意操作,然后再次使用 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) 文件。因此,如果库包含一个目标文件,其符号在链接过程中从未被引用(即未有效使用的符号),则该目标文件将不会使其成为可执行文件。
Code:
艺术-t mylib.a
这将列出存档中的所有文件。
Code:
ar -xv mylib.a myobj.o
这将从库 mylib.a 中提取对象给 myobj.o。