处理iOS Framework项目的依赖项

Łuk*_*mek 16 linker frameworks static-libraries ios

我使用这种方法创建了iOS Framework项目:https://github.com/jverkoey/iOS-Framework

工作非常简洁,但我对如何包含我的框架工作所需的库/框架有点困惑,特别是如何做到这一点,以便在使用我的框架的第三方客户端应用程序可以包含这些库也没有冲突.

假设我的框架代码需要这两件事:

  • FacebookSDK.framework
  • libFlurry.a

第一个是iOS框架.当我将它添加到我的框架中的"Link Binary With Libraries"阶段并尝试编译使用我的框架的客户端项目时,链接器抱怨缺少符号 - 我需要将FacebookSDK添加到客户端项目中这很棒:没有可能如果客户端应用想要使用Facebook,则会发生冲

但是,当我对Flurry静态库执行相同操作时,编译客户端项目时会出现重复符号错误.这让我有点困惑,因为不是FacebookSDK.framework只是一个打包的静态库?

ukaszs-iMac:FacebookSDK.framework lukasz$ file Versions/A/FacebookSDK 
Versions/A/FacebookSDK: Mach-O universal binary with 3 architectures
Versions/A/FacebookSDK (for architecture i386): current ar archive random library
Versions/A/FacebookSDK (for architecture armv7):    current ar archive random library
Versions/A/FacebookSDK (for architecture cputype (12) cpusubtype (11)): current ar archive random library
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  1. 为什么嵌入框架(如Facebook)的库没有链接到我的Framework项目产品,而库包含为.a文件?
  2. 如何在我的框架中包含.a文件,以便当使用我的框架的客户端应用程序也需要这个特定的静态库时,它不会产生重复的符号错误?

que*_*ish 17

对于您正在描述的用例,您应该从应用程序链接到这些外部库,而不是您自己的框架.它可以是一个或另一个,但不能两者兼而有之.

如果您认为这些依赖项属于应用程序的责任,您可以将它们从"Link Binary With Libraries"和任何其他显式链接配置中删除,并将框架项目与这些框架和库的路径一起投影,以便它可以找到编译时的符号(但不是链接它们)(即库的路径应包含在LIBRARY_SEARCH_PATHS中).

  • @quellish如果框架使用#import"FacebookSDK.h",那么依赖项将从应用程序链接.您将如何创建框架本身的二进制文件,因为它将失败,因为FacebookSDK的未定义符号.你能解释一下吗? (7认同)