如何组合胖静态库以用于 iOS 应用程序?

How to combine fat static libraries for use in an iOS application?

在阅读静态库和动态库以及最后阅读框架时,我感到非常困惑,Cocoa Touch Frameworks 和 Cocoa Touch Static Libraries。

我唯一理解的是静态库(框架?)是在 编译 时添加的,而动态库则不是;它们在运行时动态加载。

问:

我想在我的 iOS 应用。如果可能的话,最好将所有这些库组合在一起(...到一个框架?)。 我还想围绕这些 C 库编写一个 Swift 包装器。这个包装器最终将在我的应用程序中使用。但是,包装器不应成为我的应用程序的一部分,我想要一个单独的项目(还是一个框架?)(库和包装器可以组合在一起吗?)。

我目前正在尝试编写 Swift 包装器。 所以我从 Cocoa Touch Framework 开始(因为我认为那是最好的主意),添加了 C 库和 headers(实际上是通过 podspec,我认为这不重要尽管我也可以手动添加它们),添加了一个桥接 header(尽管一些其他用户报告框架不适用于桥接 headers,但我的确实构建成功)。这是正确的方法吗?

我读的第一篇文章was this one (called "Static and Dynamic Libraries and Frameworks in iOS")

然后,我阅读了很多关于 Whosebug 的文章,内容涉及如何编译静态库、库和框架的结构,框架实际上只是一堆库及其 header(或大约)。
我也觉得这些年来 Apple 的情况发生了变化,比如他们改变了名称和可能性(Cocoa Touch Framework(这是一个动态框架吗?)似乎已经在 [=30= 发布时引入了] 8 等),这让我更难理解事情是如何运作的。
不要误会我的意思,我之所以这么说是因为我想表明我确实做了一些研究(我认为很多),但我真的需要一些帮助才能把一切都做好。基本上,我只是在寻找我应该采取的下一步,以便将所有这些库导入我的应用程序。

这有两个部分:

  • 正在创建框架Mach-O图像
  • 正在整理 header

第一部分应该比较简单。如果您创建一个框架目标并向其添加一堆静态库,则生成的框架将包含所有这些静态库。

唯一的并发症是 Objective-C。如果您的任何静态库包含 Objective-C 代码,链接器最终可能会将其删除。有一个链接器标志 -ObjC 可以禁用此功能。

整理 header 更具挑战性。框架对如何组织 headers 有自己的看法,这通常与 UNIX 传统不一致(这似乎是你所拥有的)。关键问题是您的客户端代码如何使用这些 header。如果客户端代码执行以下操作:

#include <lib_1/----1.h>  

您必须在磁盘上保留该布局,并且在使用框架时没有明显的方法可以做到这一点。 OTOH,如果您可以控制客户端代码,并且可以将其更改为仅执行此操作:

#include <MyFramework/MyFramework.h>  

您可以在您的框架中创建一个保护伞 header,让它包含您所有的 public header,然后就可以了。

此答案是从 Apple 开发者论坛复制的。