从iPhone静态库中提取对象(*.o)文件

Bre*_*ett 28 linux compiler-construction iphone objective-c

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

但是,当我尝试使用iPhone compliled静态库时,我收到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

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

小智 42

那是因为您的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
Run Code Online (Sandbox Code Playgroud)

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


Dip*_*ara 6

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

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

  • 想通了,必须先提取:`lipo -thin x86_64 libtag.a -output libtag2.a`,然后`ar tv libtag2.a`工作 (2认同)