iOS和Xcode如何链接自定义框架

时间:2015-06-19 21:22:54

标签: ios xcode

我有一个包含自定义框架的项目,但这些自定义框架还包括自定义框架。

这是一个示例结构,其中项目符号是包含的框架:

应用

  • FrameworkA

  • FrameworkB

  • FrameworkC

FrameworkA

  • FrameworkC

FrameworkB

  • FrameworkC

由于FrameworkA和FrameworkB链接FrameworkC,以及我的应用程序使用框架A,B和C;它们都链接在一起还是在多个地方复制了框架?

这是否会增加应用的尺寸?

在此示例中,FrameworkC具有资产,如果多次复制,那么不必要地复制数据?或者这有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

iOS框架是头文件和胖静态存档库的集合。 iOS不支持包含共享库的框架。

胖静态存档库是多体系结构对象文件的集合,链接器可根据需要提取目标文件以创建可执行工件。 iOS可执行文件是自包含的可执行文件(除了作为共享对象的系统库)。

可以用脂肪检查脂肪档案。

cd FrameworkA.framework
lipo -info FrameworkA
Architectures in the fat file: FrameworkA are: armv7 armv7s i386 arm64 

创建框架时,不使用链接器工具,因为框架(在您的FrameworkA和FrameworkB中)不是可执行工件。依赖框架包含在框架项目中,因为编译器需要头文件来创建Framework A和B对象文件。对frameworkC中符号的任何引用仍未解决。

如果使用" lipo"检查FrameworkA或FrameworkB的内容。和" ar"工具和提取目标文件,然后使用" nm"转储目标文件符号,您会注意到FrameworkC中对符号的任何引用仍未解决。

注意:您需要安装Xcode命令行工具才能执行此操作。

cd FrameworkA.framework
lipo FrameworkA -thin armv7 -output FrameworkA_armv7.a
ar -t FrameworkA_armv7.a
objectA1.o
objectA2.o
objectA3.o

ar -x FrameworkA_armv7.a objectA1.o
xcrun --sdk iphoneos nm -p objectA1.o 
...
00000188 T FrameworkAFunction
         U FrameworkCFunction
...

这就是为什么在创建应用程序时,您需要项目中包含的所有三个框架(A,B和C)。当链接器在其中一个App对象文件中读取未解析的符号时,它将搜索框架A和B.当解析符号时,它将从包含该符号的存档中读取整个目标文件。然后,链接器必须解析该对象中任何未解析的依赖符号。如果其中一个未解析的符号在FrameworkC中,它将从FrameworkC中提取包含从属符号的对象

所以回答你的问题:

框架A,B和C在链接App时链接,只有解析所有符号所需的对象才从Frameworks复制到app可执行文件中。

是的,复制对象会增加可执行文件的大小,但是没有任何对象的多个副本。

当最终的App捆绑包由xcode汇编时,FrameworkC中的资产只复制一次。