构建一个使用cocoapods的可分发静态库

sta*_*low 20 xcode objective-c static-libraries cocoapods

我正在构建一个静态库,以便分发给其他iOS开发人员,并且在配置链接器以允许静态库在另一个应用程序中使用时遇到一些麻烦.我已经使用本指南创建了一个MyStaticLibrary.framework包,其中包含lib本身以及其他资源(如图像).这构建成功并使用cocoapods来获取所需的依赖项(AFNetworking等).到现在为止还挺好.

但是当我将MyStaticLibrary.framework导入到一个新的Xcode项目中以测试使用该库构建应用程序时,我得到了大量的链接器错误(架构i386的未定义符号,_ OBJC_CLASS _ $ _ CLASSNAME),表明我在这里做了一些非常错误的事情.

所以我的问题是,如何使用源自cocoapods的依赖项构建MyStaticLibrary.framework,这样我可以为第三方提供我的框架文件并允许它们访问公共头文件中指定的所有函数?

mic*_*els 11

使用CocoaPods包含的任何库都不会默认编译到您的框架中 - 它们是外部依赖项,不属于您的实际产品.但是,根据他们的常见问题解答,他们支持一种模式,您可以下载pod并且将它们链接到您的项目.从他们的FAQ:

请注意,CocoaPods本身不需要使用工作区.如果您更喜欢使用子项目,可以通过运行pod install --no-integrate来实现,这样就可以根据需要将集成集成到您的项目中.

要在编译的二进制文件中包含外部依赖项:

  • 对于代码:不要使用cocoapods,请查看要包含的存储库并将源文件复制到项目中 - 这将确保使用其余代码编译它们

  • 对于静态库(即.a文件),在框架的Link Binary With Libraries构建阶段,请确保包含您要编译的所有库.您还应确保关联的头文件包含在Copy Headers构建阶段,并具有适当的可见性.

注意以这种方式捆绑第三方库时,存在与集成框架的项目冲突的风险.例如,假设您正在使用一个名为的lib SOSomeView,并且您选择使用您的框架编译它.现在,如果您正在集成的应用程序也包含SOSomeView,您将收到一个编译时错误,该类被声明两次.要解决此问题,您应该将要硬编码的任何外部依赖项重新命名为框架(即将类重命名为XXSOSomeView).

如果您正在使用框架编译静态库,我不知道如何解决该问题.

  • 有没有办法配置目标,以便将cocoapods-sourced依赖项编译到框架中?我不同意你的评估,这违背了cocoapods的目的.强迫最终用户获取对它们甚至不可见的依赖项是没有意义的(并且它违反了框架的要求,其中之一是为最终用户提供一个简单的自包含库)将所有这些依赖项存储在框架的存储库中也没有意义.如果必须,我会将依赖项存储在repo中,但不愿意. (4认同)