我的 Xcode 项目“MyMainApp”有一个名为“MyLib”的静态库类型 Xcode 子项目。现在我需要在我的 iOS 应用程序中使用一些第三方 iOS 框架。我只想将它们添加/链接到 MyLib 而不是 MyMainApp,这样我就可以使 MyLib 可重用和独立,以便在我的其他 iOS 应用程序中使用它。MyMainApp 中的一些视图控制器使用属于 MyLib 的视图控制器之一。MyLib 中的这个视图控制器使用来自第三方框架内的类的功能。现在我面临的问题是,如果我只将第三方框架添加到 MyLib 而没有将它们添加到 MyMainApp,我会收到链接器错误“词法或预处理器问题。找不到 XXX.h 文件”。如果我将框架添加到 MyMainApp 和 MyLib 中,一切正常,但这不是我想要的。我已确保框架搜索路径和标头搜索路径是正确的。在这种情况下,我一直无法从 Apple 那里找到任何参考资料。我想知道将第三方框架和库添加/链接到静态库类型的 Xcode 子项目的最佳实践。还有解决链接器错误并将框架添加到静态库项目的解决方案吗?
3 回答
我的 Xcode 项目“MyMainApp”有一个名为“MyLib”的静态库类型 Xcode 子项目。现在我需要在我的 iOS 应用程序中使用一些第三方 iOS 框架。我只想将它们添加/链接到 MyLib 而不是 MyMainApp,这样我就可以使 MyLib 可重用和独立,以便在我的其他 iOS 应用程序中使用它。
库不会将自己与其他库链接,它们只是单独构建到未链接的*.a
二进制文件中。稍后,应用程序(并且仅在那时)会将所有这些*.a
文件及其自己的二进制文件链接在一起。
尽管库应该保持模块化并且不包含其他库代码或资源以避免版本和兼容性问题,但您是对的。
现在我面临的问题是,如果我只将第三方框架添加到 MyLib 而没有将它们添加到 MyMainApp,我会收到链接器错误“词法或预处理器问题。找不到 XXX.h 文件”。如果我将框架添加到 MyMainApp 和 MyLib 中,一切正常,但这不是我想要的。
您的应用程序间接尝试导入第 3 方标头之一。虽然您不需要引用第 3 方库代码,但您仍然需要访问其头文件以进行编译。换句话说,您不需要将 3rd 方库添加到您的应用程序,但您必须添加头文件或设置头搜索路径。
我想知道将第三方框架和库添加/链接到静态库类型的 Xcode 子项目的最佳实践。还有解决链接器错误并将框架添加到静态库项目的解决方案吗?
没有简单的“本地”方式来处理库、它们的资源和对 iOS 的依赖关系,所以你应该看看CocoaPods。
您的库必须链接它们,并且使用您的库的应用程序必须链接它们并将它们包含在应用程序包中。应用程序负责满足依赖关系。
框架可以包含资源(例如给您带来问题的头文件),这是将它们与库区分开来的主要内容之一。因此,库不能真正包含框架,即使它可以包含框架的二进制对象(代码)。
如果您的库被转换为一个框架,它可以在其中包含其他框架,这可能会满足您的需求。
- 转到“MyLib”的“构建阶段”
- 在“复制捆绑资源”下添加“第 3 方 iOS 框架”
- 编译'MyLib'
- 从“MyMainApp”中删除“第 3 方 iOS 框架”
- 运行“我的主应用程序”