在 iOS 的动态框架中包含静态库

Posted

技术标签:

【中文标题】在 iOS 的动态框架中包含静态库【英文标题】:Including a static library inside a dynamic framework in iOS 【发布时间】:2012-04-02 13:37:58 【问题描述】:

我需要为我正在处理的项目创建一个框架(需要一个静态库)。我使用this tutorial创建框架,然后将静态库复制到项目中,它就可以工作了。

但是,当我将框架拖到 ios 项目时,它会显示大量错误。

`Undefined symbols for architecture i386:"_OBJC_CLASS_$_SomeClassFromTheStaticLibrary",referenced from:_OBJC_CLASS_$_AnotherClass in MyFramework`

我认为正在发生的事情是 iOS 项目想要重新编译框架但它不能,因为它找不到静态库。 如果我将静态库添加到 iOS 项目,所有错误都会消失。这是我想要避免的。

基本上我想拥有 iOS 项目 -> 框架 -> 库,而不是在项目和框架中都有库。

我尝试将静态库作为资源添加到框架中,但没有成功。

【问题讨论】:

你的问题的任何解决方案?我在这里面临类似的问题.. 我确实解决了它,但我有点作弊。我可以访问所有三个项目的源代码,因此我将静态库重新编译为框架。这样我就有了 iOS 项目 -> 框架 -> 框架,并且只需要导入一个框架。 还没有真正的解决方案吗?如果我将静态库包含到 iOS 项目中,我什至无法摆脱这个问题...... 【参考方案1】:

我怀疑这是可能的。当您考虑正在发生的事情时,您会发现问题所在。

    编译框架并处理静态库,以便去除多余符号等内容 应用程序现在已编译并链接到可能具有或可能没有应用程序所需符号的框架

如果只有框架使用静态库(逻辑),我确实可以做到这一点,但我找不到在框架和应用程序之间共享代码的方法。

【讨论】:

【参考方案2】:

如果符号被隐藏(通过默认隐藏的符号/GCC_SYMBOLS_PRIVATE_EXTERN 设置为 YES__attribute__ ((visibility ("hidden"))) 应用于某些符号),则该符号将在静态链接库时可用,但不是动态链接框架时。

确保静态库的符号未被隐藏,并且您应该能够从您的应用程序中访问它们。

【讨论】:

【参考方案3】:

我已按照link 创建自定义框架。我的框架中有静态库,它可以正常工作。

为了便于理解,我在my blog 中复制了他的步骤,并附上了一个使其通用的脚本。

【讨论】:

你的静态库在哪里?您是否在构建阶段选项卡中链接了它们?

以上是关于在 iOS 的动态框架中包含静态库的主要内容,如果未能解决你的问题,请参考以下文章

如何打开框架中包含的视图控制器作为 iOS 的静态库?

在 Xcode 静态库中包含框架?

iOS 静态库 - 是不是可以在我的库中包含 AdSupport.framework?

在 netbeans 的静态库中包含静态库

我可以在自己的静态库项目中包含现有的静态库吗?

CGO静态库和动态库