【发布时间】:2014-02-01 16:45:28
【问题描述】:
我有一个很大的静态库,我想打包成一个 iOS 静态框架以方便使用。该库实际上是几个.a 文件,每个库的逻辑模块一个。
我为设备编译了 .a 文件(带有armv7、armv7s、arm64 的胖文件)和模拟器(带有i386、x86_64 的胖文件)。
现在,AFAIK,我需要将所有这些文件合并到一个大文件中,以便构建一个合适的框架。
使用此处描述的技术 (Combine static libraries),我可以做到:
libtool -static -o new.a old1.a old2.a
但显然old1.a 和old2.a 都包含相同的符号。因此,当链接到我的框架时,我收到链接器错误(出于正当原因)duplicate symbols。
一种更正确的方法(从而避免重复符号)似乎是解压缩 .o 文件,并将它们组合成一个大的 .a 文件 (How to pack multiple library archives (.a) into one archive file?)
ar x old1.a
ar x old2.a
ar rcs new.a *.o
现在,请记住,old1.a 和 old2.a 是胖文件,所以我需要根据架构将其分开。
这就是我要做的:
lipo old1.a -thin armv7 -output armv7/old1.a
cd armv7; ar x old1.a; cd ..
...
lipo old1.a -thin x86_64 -output x86_64/old1.a
cd x86_64; ar x old1.a; cd ..
// Same goes for old2.a ...
// Then,
libtool -static -o new.a armv7/*.o armv7s/*.o arm64/*.o // ... etc
但由于某种原因,当链接到这样创建的框架时,链接器找不到任何符号(即使nm 显示了所有符号)。
知道如何构建该静态框架吗?
【问题讨论】:
-
你不能只从源代码编译库吗?除非你想用符号来做巫术,否则这可能是最简单的。
-
好吧,我需要以某种方式将所有代码编译到一个静态库中,这需要对 3rd 方代码的构建系统进行大量修改
标签: ios iphone c static-libraries libtool-xcode