【问题标题】:How does iOS and Xcode link custom frameworksiOS 和 Xcode 如何链接自定义框架
【发布时间】:2015-06-19 21:22:54
【问题描述】:

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

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

应用程序

  • 框架A

  • 框架B

  • 框架C

框架A

  • 框架C

框架B

  • 框架C

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

这会增加应用程序的大小吗?

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

【问题讨论】:

    标签: ios xcode


    【解决方案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 被链接,只有解析所有符号所需的对象从框架复制到应用程序可执行文件中。

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

    FrameworkC 中的资产只被复制一次,当最终的 App bundle 由 xcode 组装时。

    【讨论】:

    • 谢谢!了解非常有用。
    猜你喜欢
    • 2014-06-15
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 2018-04-10
    • 1970-01-01
    • 2015-08-08
    相关资源
    最近更新 更多