将第三方框架添加到 iOS 应用中的 Xcode 子项目或主项目
Posted
技术标签:
【中文标题】将第三方框架添加到 iOS 应用中的 Xcode 子项目或主项目【英文标题】:Add third party framework to Xcode subproject or main project in iOS app 【发布时间】:2014-05-29 17:29:25 【问题描述】:我的 Xcode 项目“MyMainApp”有一个名为“MyLib”的静态库类型 Xcode 子项目。现在我需要在我的 ios 应用程序中使用一些第三方 iOS 框架。我只想将它们添加/链接到 MyLib 而不是 MyMainApp,这样我就可以使 MyLib 可重用和独立,以便在我的其他 iOS 应用程序中使用它。 MyMainApp 中的一些视图控制器使用属于 MyLib 的视图控制器之一。 MyLib 中的这个视图控制器使用来自第三方框架内的类的功能。现在我面临的问题是,如果我只将第三方框架添加到 MyLib 而没有将它们添加到 MyMainApp,我会收到链接器错误“词法或预处理器问题。找不到 XXX.h 文件”。如果我将框架添加到 MyMainApp 和 MyLib 中,一切正常,但这不是我想要的。我已确保框架搜索路径和标头搜索路径是正确的。在这种情况下,我一直无法从 Apple 那里找到任何参考资料。我想知道将第三方框架和库添加/链接到静态库类型的 Xcode 子项目的最佳实践。还有没有解决链接器错误并仅将框架添加到静态库项目的解决方案?
【问题讨论】:
在这里尝试理解您的问题。您是否尝试使用/分发链接第 3 方框架的框架,但您的框架的用户不必链接甚至不知道第 3 方框架?将它们全部打包到一个整洁的框架中? @Lucy,我正在尝试在我的 Xcode 项目中使用静态库,并且静态库链接到其他 3rd 方框架。我想知道的是是否有可能只有静态库链接到第 3 方框架,而我的 Xcode 项目只是链接到静态库而不是第 3 方框架。目前我必须将我的 Xcode 项目和我的静态库与 3rd 方框架链接起来,否则我会收到链接器错误。 好的。我认为我们在同一页上,也许。我想做同样的事情。目前,我有一个通用框架,它确实链接到第 3 方框架中。而且,是的,使用我的框架的应用程序也必须链接到第 3 方框架中。我还没有尝试将 3rd 方框架添加到捆绑资源中。我在你的框架中遇到过“嵌入”框架这个术语……不知道这是什么意思。如果我找到答案,我会告诉你的。请为我做同样的事情。 :-) 嗨@Lucy,您找到将第三方框架链接到框架中的解决方案了吗? 嗨@shoujo_sm,我还在做这方面的工作。我的公司现在让我从事嵌入式 C++ 代码的工作。如果我想通了,我会告诉你,如果你想通了,请告诉我。 【参考方案1】:-
转到“MyLib”的“构建阶段”
在“复制捆绑资源”下添加“第 3 方 iOS 框架”
编译“MyLib”
从“MyMainApp”中删除“第 3 方 iOS 框架”
运行“MyMainApp”
【讨论】:
我完全按照您提到的步骤操作,但在运行 MyMainApp 时出现链接器错误“未定义的符号..”。【参考方案2】:您的库必须链接它们,使用您的库的应用程序必须链接它们并将它们包含在应用程序包中。应用程序负责满足依赖关系。
框架可以包含资源(例如给您带来问题的头文件),这是它们与库的主要区别之一。因此,库不能真正包含框架,即使它可以包含框架的二进制对象(代码)。
如果您的库被转换为框架,它可以在其中包含其他框架,这可能会满足您的需求。
【讨论】:
【参考方案3】:我的 Xcode 项目“MyMainApp”有一个静态库类型 Xcode 名为“MyLib”的子项目。现在我需要使用一些第三方 iOS 我的 iOS 应用程序中的框架。我只想将它们添加/链接到 MyLib 而不是反对 MyMainApp 所以我可以使 MyLib 可重用和 独立的,也可以在我的其他 iOS 应用程序中使用它。
库不会将自己与其他库链接,它们只是单独构建到未链接的*.a
二进制文件中。稍后,应用程序(并且仅在那时)会将所有这些 *.a
文件及其自己的二进制文件链接在一起。
虽然库应该保持模块化并且不包含其他库代码或资源以避免版本和兼容性问题,但您是对的。
现在我面临的问题是,如果我将第三方框架添加到 只是 MyLib,不要将它们添加到 MyMainApp,我收到链接器错误 “词法或预处理器问题。找不到 XXX.h 文件”。一切 如果我将框架添加到 MyMainApp 和 MyLib 但效果很好 这不是我想要的。
您的应用程序正在间接尝试导入第 3 方标头之一。虽然您不需要引用第 3 方库代码,但您仍然需要访问其头文件以进行编译。换句话说,您不需要将 3rd 方库添加到您的应用程序中,但您必须添加头文件或设置头搜索路径。
我想知道添加/链接第三方的最佳做法 框架和库到静态类型的 Xcode 子项目 图书馆。还有一种解决方案可以克服链接器错误并添加 框架仅适用于静态库项目?
在 iOS 上没有简单的“原生”方式来处理库、它们的资源和依赖项,所以你应该看看 CocoaPods。
【讨论】:
未将第 3 方库链接到 MyMainApp 并且仅设置搜索路径也不起作用,并导致链接器错误。 是的,您将所有内容链接到您的应用程序。另一方面,“我只想将它们添加/链接到 MyLib 而不是 MyMainApp”是错误的。以上是关于将第三方框架添加到 iOS 应用中的 Xcode 子项目或主项目的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 10:代码签名我的App + Framework失败,因为签署第三方依赖框架(PromiseKit)失败。适用于Xcode 9
使用 CLI 命令或 Ionic 配置将 AdSupport 框架添加到 Xcode 项目