我正在构建一个静态库,以便分发给其他iOS开发人员,并且在配置链接器以允许静态库在另一个应用程序中使用时遇到一些麻烦。我使用this guide创建了一个MyStaticLibrary.framework包,其中包含lib本身以及其他资源,如图像。这构建成功并使用cocoapods来获取所需的依赖项(AFNetworking等)。到目前为止,非常好。
但是当我将MyStaticLibrary.framework导入到一个新的Xcode项目来测试使用该库构建应用程序时,我得到了大量的链接器错误(架构i386的未定义符号,_ OBJC_CLASS _ $ _ CLASSNAME)表明我正在做某事这里非常错误。
所以我的问题是,如何使用源自cocoapods的依赖项构建MyStaticLibrary.framework,以便我可以为第三方提供我的框架文件并允许它们访问公共头文件中指定的所有函数?
答案 0 :(得分:11)
默认情况下,使用CocoaPods包含的任何库都会不编译到您的框架中 - 它们意味着是不属于您实际产品的外部依赖项。但是,根据他们的常见问题解答,他们支持一种模式,您可以在其中下载pod,不将它们链接到您的项目。从他们的常见问题:
请注意,CocoaPods本身不需要使用工作区。如果 您更喜欢使用子项目,您可以通过运行pod安装来实现 --no-integrate,根据您的需要将整合到您的项目中。
在已编译的二进制文件中包含外部依赖项:
对于代码:不要使用cocoapods,请查看要包含的存储库并将源文件复制到项目中 - 这将确保使用其余代码编译它们
对于静态库(即.a
文件),在框架的Link Binary With Libraries
构建阶段,请确保包含您要编译的所有文件。您还应确保关联的头文件包含在Copy Headers
构建阶段,并具有适当的可见性。
注意以这种方式捆绑第三方库时,存在与集成框架的项目冲突的风险。例如,假设您正在使用名为SOSomeView
的库,并选择使用您的框架编译它。现在,如果您正在集成的应用程序还包含SOSomeView
,您将收到一个编译时错误,该类被声明两次。要解决此问题,您应该将要硬编码的任何外部依赖项重新命名为框架(即将类重命名为XXSOSomeView
)。
如果您正在使用框架编译静态库,我不知道如何解决该问题。