2015-06-19 34 views
1

我有一个包含自定义框架的项目,但这些自定义框架还包括自定义框架。iOS和Xcode如何链接自定义框架

下面是一个示例结构,其中,所述子弹是包括框架:

应用

  • FrameworkA

  • FrameworkB

  • FrameworkC

FrameworkA

  • FrameworkC

FrameworkB

  • FrameworkC

由于FrameworkA和FrameworkB链接FrameworkC,沿着我的应用程序使用框架A,B,和C;它们是全部链接在一起还是被复制到多个地方的框架?

这是否增加了应用程序的大小?

在这个例子中,FrameworkC拥有资产,如果它被复制多次不会不必要地重复数据?或者有更好的方法?

回答

1

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

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

脂肪档案可以用lipo进行检查。

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

当你创建一个框架,连接器工具不能使用,因为框架(在你的情况FrameworkA和FrameworkB)是不可执行的假象。依赖框架包含在框架项目中,因为编译器需要头文件来创建框架A和B对象文件。在frameworkC中对符号的任何引用都没有解决。

如果您使用“lipo”和“ar”工具检查FrameworkA或FrameworkB的内容并提取目标文件,然后使用“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,当应用程序被链接的联系,只有将解析所有符号所需的对象从框架复制到应用程序可执行文件中。

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

当最终的应用包由xcode组装时,FrameworkC中的资源只被复制一次。

+0

谢谢!非常有用的知道。 –

+0

很高兴帮助。 – BitByteDog